本實(shí)驗(yàn)測(cè)試同步代碼塊synchronized(class2)對(duì)class2上鎖后,其他線程只能以同步的方式調(diào)用class2中的靜態(tài)同步方法。
/**
* @author wuyoushan
* @date 2017/4/28.
*/
public class OutClass {
static class InnerClass1{
public void method1(InnerClass2 class2){
String threadName=Thread.currentThread().getName();
synchronized (class2){
System.out.println(threadName+" 進(jìn)入InnerClass1類中的method1方法");
for (int i = 1; i < 10 ; i++) {
System.out.println(Thread.currentThread().getName()+" 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+" 進(jìn)入InnerClass1類中的method2方法");
for (int j = 0; j <10; j++) {
System.out.println("j="+j);
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+" 進(jìn)入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方法");
}
}
}
/**
* @author wuyoushan
* @date 2017/3/20.
*/
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();
}
}
程序的運(yùn)行結(jié)果為:
T1 進(jìn)入InnerClass1類中的method1方法
T2 進(jìn)入InnerClass1類中的method2方法
T1 i=1
j=0
T1 i=2
....
T1 離開InnerClass1類中的method1方法
T3 進(jìn)入InnerClass2類中的method1方法
j=9
k=0
摘選自 java多線程核心編程技術(shù)-2.2.15