JAva同期メカニズムおよびsynchronizedキーワードの応用2

2905 ワード

クラス定義:
 
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インタフェースが提供されている理由が容易に理解できます.