synchronized是java中並發編程最重要的關鍵字之一。如果沒搞清楚synchronized鎖的是什么,可能導致用了沒效果,沒控制住並發訪問
synchronized常用的方式有以下四種
public class SyncTest{
public
synchronized void methodA(){
}
public void methodB(){
synchronized(this){
}
}
public void methodC(){
synchronized(xxx.class){
}
}
public
static synchronized methodD(){
}
}
前兩種鎖的是
實例對象,即對象鎖,后兩種鎖的是
類對象,即類鎖(類鎖只是個概念,因為本質鎖的本質還是對象)
結論:
1.持有的是同一個實例,是能夠達到鎖住資源,不讓別的線程進入的目的的。就算訪問的不是相同的代碼塊,也會等待。兩個線程持有的是
同一個syncTest對象,一個執行syncTest.methodA(),另一個執行syncTest.methodB(),也會有鎖的效果。
2.但是如果大家都是
new SyncTest()的話,即使訪問同一段代碼,是
鎖不住的!!!!!!!因為大家所持的實例對象不一樣!!!!
3.后兩種的話,無論是用類直接調用,還是實例調用,無論是否同一個實例,都會互斥。
4.對象鎖和類鎖,相互不影響