如果一个对象作为同步代码块的对象,那么该对象同步的代码段和该对象内部通过同步方法或者自身对象的代码段会被同步。
看例子:
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 j=0;j<10;j++){ System.out.println("i="+j); try { Thread.sleep(100); } catch (InterruptedException e) { } } 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 OutClass.InnerClass1 in1=new OutClass.InnerClass1(); final OutClass.InnerClass2 in2=new OutClass.InnerClass2(); Thread t1=new Thread(new Runnable() { @Override public void run() { in1.method1(in2); } },"T1"); Thread t2=new Thread(new Runnable() { @Override public void run() { in1.method2(); } },"T2"); Thread t3=new Thread(new Runnable() { @Override public void run() { in2.method1(); } },"T3"); t1.start(); t2.start(); t3.start(); } }T2 进入InnerClass1类中的method2方法
T1 进入InnerClass1类中的method1方法
i=0
i=0
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
T1 离开InnerClass1类中的method1方法
T3 进入InnerClass2类中的method1方法
k=0
k=1
i=1
i=2
k=2
i=3
k=3
k=4
i=4
k=5
i=5
i=6
k=6
k=7
i=7
i=8
k=8
k=9
i=9
T2 离开InnerClass1类中的method2方法
T3 离开InnerClass2类中的method1方法
in2.method1方法一定要等到in1.method1方法执行完后才执行。