
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
昆明IT培训的老师先讲一个例子
publicclassOutClass {staticclassInnerClass1 {publicvoidmethod1(InnerClass2 class2){ String threadName=Thread.currentThread().getName();synchronized(class2) { System.out.println(threadName+ "进入InnerClass1类中的method1方法");for(inti = 0; i < 10; i++){ System.out.println("i=" +i);try{ Thread.sleep(100); }catch(InterruptedException e) { e.printStackTrace(); } } System.out.println(threadName+ "离开InnerClass1类中的method1方法"); } }publicsynchronizedvoidmethod2(){ String threadName=Thread.currentThread().getName(); System.out.println(threadName+"进入InnerClass1类中的method2方法");for(inti = 0; i < 10; i++){ System.out.println("i=" +i);try{ Thread.sleep(100); }catch(InterruptedException e) { e.printStackTrace(); } } System.out.println(threadName+ "离开InnerClass1类中的method2方法"); } }staticclassInnerClass2{publicsynchronizedvoidmethod1(){ String threadName=Thread.currentThread().getName(); System.out.println(threadName+ "进入InnerClass2类中的method1方法");for(intk = 0; k < 10; k++){ System.out.println("k=" +k);try{ Thread.sleep(100); }catch(InterruptedException e){ e.printStackTrace(); } } System.out.println(threadName+ "离开InnerClass2类中的method1方法"); } } }
publicclassRun {publicstaticvoidmain(String[] args) {finalInnerClass1 in1 =newInnerClass1();finalInnerClass2 in2 =newInnerClass2(); Thread t1=newThread(newRunnable() { @Overridepublicvoidrun() {//TODO Auto-generated method stubin1.method1(in2); } },"T1"); Thread t2=newThread(newRunnable() { @Overridepublicvoidrun() {//TODO Auto-generated method stubin1.method2(); } },"T2"); Thread t3=newThread(newRunnable() { @Overridepublicvoidrun() {//TODO Auto-generated method stubin2.method1(); } },"T3"); t1.start(); t2.start(); t3.start(); } }
T1进入InnerClass1类中的method1方法T2进入InnerClass1类中的method2方法i=0i=0i=1i=1i=2i=2i=3i=3i=4i=4i=5i=5i=6i=6i=7i=7i=8i=8i=9i=9T2离开InnerClass1类中的method2方法T1离开InnerClass1类中的method1方法T3进入InnerClass2类中的method1方法k=0k=1k=2k=3k=4k=5k=6k=7k=8k=9T3离开InnerClass2类中的method1方法
运行这个小例子,会发现是T1和T2是异步,T3与其他两个是同步的,显然T3有锁被T1或者T2拿到了。如上图所示。
首先,T1和T2是异步的很好理解,一个获取的锁是当前对象,一个获取的是类,不是一样的当然是异步。
那么看T3:
将t1.start()这个代码注掉,查看结果:
T2进入InnerClass1类中的method2方法i=0T3进入InnerClass2类中的method1方法k=0k=1i=1k=2i=2i=3k=3i=4k=4k=5i=5i=6k=6i=7k=7k=8i=8i=9k=9T3离开InnerClass2类中的method1方法T2离开InnerClass1类中的method2方法
异步的,也就是说T2与T3获取的不是同一个锁。T2获取的是in1。
也就是说T1与T3获取的是同一个锁,T1的锁是in2,T3的锁也是in2.