首先,什麼是鎖,爲什麼要用這個玩意兒?
掌握Java中鎖是Java多線程編程中繞不開的知識,只有知道理解Java各種鎖才能在編碼過程中靈活運用,寫出更高效的多線程程序。而理解掌握鎖的第一步,可從宏觀上對比理解一下各種鎖概念。
synchronized同步鎖:
public class UserInfoService {
/** 普通代碼 **/
public String getUserInfo(String id) {
// TODO
Sysotem.out.println("--------------普通代碼(無鎖)--------------");
return null;
}
// 同步鎖(鎖方法體)
public synchronized String getUserInfo(String id) {
// TODO
Sysotem.out.println("--------------同步鎖(鎖方法體)--------------");
return null;
}
// 同步鎖(鎖代碼塊)
public String getUserInfo(String id) {
synchronized (this) {
// TODO
Sysotem.out.println("--------------同步鎖(鎖代碼塊)--------------");
}
return null;
}
}
synchronized可重入鎖:
可重入鎖又名遞歸鎖,是指在同一個線程在外層方法獲取鎖的時候,在進入內層方法會自動獲取鎖。說的有點抽象,下面會有一個代碼的示例。
對於Java ReentrantLock而言, 他的名字就可以看出是一個可重入鎖,其名字是Re entrant Lock重新進入鎖。
對於Synchronized而言,也是一個可重入鎖。可重入鎖的一個好處是可一定程度避免死鎖。
synchronized void setA() throws Exception{
Thread.sleep(1000);
setB();
}
synchronized void setB() throws Exception{
Thread.sleep(1000);
}
上面的代碼就是一個可重入鎖的一個特點,如果不是可重入鎖的話,setB可能不會被當前線程執行,可能造成死鎖。
持續更新中…
如有對思路不清晰或有更好的解決思路,歡迎與本人交流,QQ羣:273557553,個人微信:seesun2012
你的提問是小編創作靈感的來源!