介紹
Java中的synchronized
關鍵字是一種內建的同步機制,用於實現執行緒之間的互斥,以確保多個執行緒在同一時刻只能有一個執行緒訪問特定的程式碼段或物件。synchronized
可以用於方法或程式碼塊,從而實現對共享資源的安全訪問。
前言
需要明確的是,鎖是針對物件而言的,以下場景實際上都是在描述外在表現,內部實現請細究jvm原理。現在,用一句話來概括以下場景,執行緒只有拿到物件的鎖,才能對鎖住的程式碼塊進行訪問。
使用場景
-
修飾具體物件:
- synchronized(this){}
- synchronized (object){}
- 在以上兩種情況下,鎖住的範圍是{}之間,需要拿到()中的這個物件的鎖,才能訪問{}之間的程式碼體。
- 由於每一個類都對應著一個Class物件,也可以這麼寫:synchronized(類名.class) {}
- 一個有意思的實現
- 當沒有明確的物件,僅僅想讓一段程式碼同步,建立一個節省的物件來充當鎖:private byte[] lock = new byte[0];
-
成員方法(非靜態):
- 在方法的前面加synchronized 如,public synchronized void
- 現在,代指當前方法為方法A,在以上情況下,鎖住的範圍是當前方法的方法體,需要拿到當前物件的鎖,才能訪問當前物件的方法A。即,成員方法是歸屬於特定物件的,拿到該物件(或者說例項)的鎖,能訪問該物件從屬的方法A的方法體,但是該類的不同物件而言,訪問每個物件裡的該方法,都需要當前物件的鎖。
-
修飾靜態方法:
- public synchronized static void method()
- 靜態方法是屬於類的而不屬於物件的。同樣的,當使用 synchronized 修飾靜態方法時,鎖住的是該類的類物件(Class object),而不是具體的例項物件,這意味著所有該類的靜態方法將共享同一個鎖,而不管它們是被哪個例項呼叫的,該例項都要拿到該類的類物件的鎖。
後記
待補充jvm知識
參考文章
https://blog.csdn.net/luoweifu/article/details/46613015
https://www.cnblogs.com/lifegoeson/p/13683785.html