1. 程式人生 > >java關鍵字之synchronized

java關鍵字之synchronized

運行 head 當前 阻塞 tab 同步 class align 可能

1.synchronized可以用了修飾一個普通方法,或者代碼塊,這個時候synchronized鎖定的是當前對象,只要有一個線程在訪問對應的方法或代碼塊,其他線程必須等待。
2.synchronized只對修飾的方法有效,鎖定對象的其他非synchronized方法還是可以訪問的
3.synchronized也可以用來鎖定指定對象,當一個線程訪問指定對象時,其他試圖訪問指定對象的線程將會阻塞,直到該線程訪問指定對象結束
4.synchronized可以用了修飾一個靜態方法,靜態方法是屬於類的而不屬於對象的。同樣的,synchronized修飾的靜態方法鎖定的是這個類的所有對象
5.synchronized(*.class)效果跟鎖定靜態方法相同,都是鎖定這個類的所有對象。

總結

A. 無論synchronized關鍵字加在方法上還是對象上,如果它作用的對象是非靜態的,則它取得的鎖是對象;如果synchronized作用對象是靜態方法或一個類,則它取得的鎖是對類,該類所有的對象同一把鎖。
B. 每個對象只有一個鎖(lock)與之相關聯,誰拿到這個鎖誰就可以運行它所控制的那段代碼。
C. 實現同步是要很大的系統開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。

修飾內容鎖類型示例
修飾代碼塊 任意對象鎖 示例四
修飾普通方法 this鎖 示例五
修飾靜態方法 類鎖 示例六

java關鍵字之synchronized