“可重入锁”的概念是:自己可以再次获得自己的内部锁。比如有一条线程获得了某个对象的锁,此时这个对象还没有释放,当其再次想获得这个对象的锁的时候还是可以获得的,如果不可锁重入的话,就会造成死锁。
classsysTest{synchronized voidtest1(String str){
System.out.println(str+"1");
test2(str);
System.out.println("end" +str);
}synchronizedvoidtest2(String str){
System.out.println(str+"2");
}
}class myThread extendsThread{
String str= null;publicmyThread(String str) {this.str =str;
}
@Overridepublic voidrun() {//TODO Auto-generated method stub
super.run();newsysTest().test1(str);
}
}public classsynchronizedTest {public static voidmain(String[] args) {//TODO Auto-generated method stub
myThread th1 = new myThread("1str");
myThread th2= new myThread("2str");
th1.start();
th2.start();
}
}
在加粗的sychronized在的时候结果会有下面,结果不唯一的:
1str1
2str1
1str2
2str2
end2str
end1str
在加粗的sychronized去掉的时候结果会有下面,结果唯一的:
1str1
1str2
end1str
2str1
2str2
end2str
在这里必须要认识到,加一个sychronized方法里调用sychronized方法会造成不同步,需要注意。原因是两个锁的问题,
这个时候使用可重入概念解决的话,就要使用对象锁,因为在sychronized()代码块中再次获得该锁就会可以得到:
classsysTest{static Object object = newObject();voidtest1(String str){synchronized(object){
System.out.println(str+"1");
test2(str);
System.out.println("end" +str);
}
}voidtest2(String str){synchronized(object){
System.out.println(str+"2");
}
}
}class myThread extendsThread{
String str= null;publicmyThread(String str) {this.str =str;
}
@Overridepublic voidrun() {//TODO Auto-generated method stub
super.run();newsysTest().test1(str);
}
}public classsynchronizedTest {public static voidmain(String[] args) {//TODO Auto-generated method stub
myThread th1 = new myThread("1str");
myThread th2= new myThread("2str");
th1.start();
th2.start();
}
}
结果:
1str1
1str2
end1str
2str1
2str2
end2str