synchronized鎖的是什么?


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.對象鎖和類鎖,相互不影響


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM