JAva同期メカニズムおよびsynchronizedキーワードの応用2
2905 ワード
クラス定義:
質問:
マルチスレッドがmethod 1とmethod 2に同時にアクセスすると、両者は反発しますか?
次のテストプログラムでこの質問に答えます.
結論は明らかで,余計なことを言う必要はない.その理由として、method 1とmethod 2が持つロックはobjインスタンスロックであるため、同じobjに対して2つのメソッドを呼び出すと、両者は同時に実行できない.符号化に際してはこの点に注意するが、この場合のオブジェクトの同時能力は比較的劣り、javaを参照することができる.util.Vectorのgetとsetメソッドでは、JDKの新しいバージョンで代替のListインタフェースが提供されている理由が容易に理解できます.
public class Test{
public synchronized method1(){...}
public synchronized method2(){...}
}
質問:
マルチスレッドがmethod 1とmethod 2に同時にアクセスすると、両者は反発しますか?
次のテストプログラムでこの質問に答えます.
public class TestSynchronizedMethod {
private void ivkMethod1(){
Thread thread1 = new Thread() {
public void run() {
for(int i = 0; i < 20; i++) {
//System.out.println("
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
//System.out.println("~~~~ start thread method1 ");
method1();
//System.out.println("~~~~ end thread method1 ");
}
}
};
thread1.start();
}
private void ivkMethod2(){
Thread thread2 = new Thread() {
public void run() {
for(int i = 0; i < 20; i++) {
//System.out.println("
#################################################");
//System.out.println("#### start thread method2 ");
method2();
//System.out.println("#### end thread method2 ");
}
}
};
thread2.start();
}
private synchronized void method1(){
System.out.println("
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println("~~~~ enter method1");
try{
System.out.println("~~~~ method1 begin to sleep 10s");
Thread.sleep(10000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("~~~~ method1 end sleep");
}
private synchronized void method2(){
System.out.println("
#################################################");
System.out.println("#### enter method2");
try{
System.out.println("#### method2 begin to sleep 3s");
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("#### method2 end sleep");
}
/**
* @param args
*/
public static void main(String[] args) {
try {
TestSynchronizedMethod obj = new TestSynchronizedMethod();
obj.ivkMethod1();
obj.ivkMethod2();
} catch (Exception e) {
e.printStackTrace();
} catch (Error er) {
er.printStackTrace();
}
}
}
結論は明らかで,余計なことを言う必要はない.その理由として、method 1とmethod 2が持つロックはobjインスタンスロックであるため、同じobjに対して2つのメソッドを呼び出すと、両者は同時に実行できない.符号化に際してはこの点に注意するが、この場合のオブジェクトの同時能力は比較的劣り、javaを参照することができる.util.Vectorのgetとsetメソッドでは、JDKの新しいバージョンで代替のListインタフェースが提供されている理由が容易に理解できます.