「可重入鎖」的概念是:本身能夠再次得到本身的內部鎖。好比有一條線程得到了某個對象的鎖,此時這個對象尚未釋放,當其再次想得到這個對象的鎖的時候仍是能夠得到的,若是不可鎖重入的話,就會形成死鎖。ide
class sysTest{ synchronized void test1(String str){ System.out.println(str+"1"); test2(str); System.out.println("end" + str); } synchronized void test2(String str){ System.out.println(str+"2"); } } class myThread extends Thread{ String str = null; public myThread(String str) { this.str = str; } @Override public void run() { // TODO Auto-generated method stub super.run(); new sysTest().test1(str); } } public class synchronizedTest { public static void main(String[] args) { // TODO Auto-generated method stub myThread th1 = new myThread("1str"); myThread th2 = new myThread("2str"); th1.start(); th2.start(); } }
在加粗的sychronized在的時候結果會有下面,結果不惟一的:this
1str1spa
2str1線程
1str2code
2str2對象
end2strblog
end1str同步
在加粗的sychronized去掉的時候結果會有下面,結果惟一的:class
1str1test
1str2
end1str
2str1
2str2
end2str
在這裏必需要認識到,加一個sychronized方法裏調用sychronized方法會形成不一樣步,須要注意。緣由是兩個鎖的問題,
這個時候使用可重入概念解決的話,就要使用對象鎖,由於在sychronized()代碼塊中再次得到該鎖就會能夠獲得:
class sysTest{ static Object object = new Object(); void test1(String str){ synchronized(object){ System.out.println(str+"1"); test2(str); System.out.println("end" + str); } } void test2(String str){ synchronized(object){ System.out.println(str+"2"); } } } class myThread extends Thread{ String str = null; public myThread(String str) { this.str = str; } @Override public void run() { // TODO Auto-generated method stub super.run(); new sysTest().test1(str); } } public class synchronizedTest { public static void main(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