首先,有一個例子 運行這個小例子,會發現是T1和T2是非同步,T3與其他兩個是同步的,顯然T3有鎖被T1或者T2拿到了。如上圖所示。 首先,T1和T2是非同步的很好理解,一個獲取的鎖是當前對象,一個獲取的是類,不是一樣的當然是非同步。 那麼看T3: 將t1.start()這個代碼註掉,查看結果: 非同步的, ...
首先,有一個例子
public class OutClass { static class InnerClass1 { public void method1(InnerClass2 class2){ String threadName = Thread.currentThread().getName(); synchronized (class2) { System.out.println(threadName + "進入InnerClass1類中的method1方法"); for(int i = 0; i < 10; i++){ System.out.println("i=" + i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(threadName + "離開InnerClass1類中的method1方法"); } } public synchronized void method2(){ String threadName = Thread.currentThread().getName(); System.out.println(threadName +"進入InnerClass1類中的method2方法"); for(int i = 0; i < 10; i++){ System.out.println("i=" + i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(threadName + "離開InnerClass1類中的method2方法"); } } static class InnerClass2{ public synchronized void method1(){ String threadName = Thread.currentThread().getName(); System.out.println(threadName + "進入InnerClass2類中的method1方法"); for(int k = 0; k < 10; k++){ System.out.println("k=" + k); try{ Thread.sleep(100); }catch(InterruptedException e){ e.printStackTrace(); } } System.out.println(threadName + "離開InnerClass2類中的method1方法"); } } }
public class Run { public static void main(String[] args) { final InnerClass1 in1 = new InnerClass1(); final InnerClass2 in2 = new InnerClass2(); Thread t1 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub in1.method1(in2); } },"T1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub in1.method2(); } },"T2"); Thread t3 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub in2.method1(); } }, "T3"); t1.start(); t2.start(); t3.start(); } }
T1進入InnerClass1類中的method1方法 T2進入InnerClass1類中的method2方法 i=0 i=0 i=1 i=1 i=2 i=2 i=3 i=3 i=4 i=4 i=5 i=5 i=6 i=6 i=7 i=7 i=8 i=8 i=9 i=9 T2離開InnerClass1類中的method2方法 T1離開InnerClass1類中的method1方法 T3進入InnerClass2類中的method1方法 k=0 k=1 k=2 k=3 k=4 k=5 k=6 k=7 k=8 k=9 T3離開InnerClass2類中的method1方法
運行這個小例子,會發現是T1和T2是非同步,T3與其他兩個是同步的,顯然T3有鎖被T1或者T2拿到了。如上圖所示。
首先,T1和T2是非同步的很好理解,一個獲取的鎖是當前對象,一個獲取的是類,不是一樣的當然是非同步。
那麼看T3:
將t1.start()這個代碼註掉,查看結果:
T2進入InnerClass1類中的method2方法 i=0 T3進入InnerClass2類中的method1方法 k=0 k=1 i=1 k=2 i=2 i=3 k=3 i=4 k=4 k=5 i=5 i=6 k=6 i=7 k=7 k=8 i=8 i=9 k=9 T3離開InnerClass2類中的method1方法 T2離開InnerClass1類中的method2方法
非同步的,也就是說T2與T3獲取的不是同一個鎖。T2獲取的是in1。
也就是說T1與T3獲取的是同一個鎖,T1的鎖是in2,T3的鎖也是in2.