同步代碼塊,同步方法,同步靜態方法,同步非靜態方法的區別

首先關於鎖和同步,有一下幾個要點:
1)、只能同步方法,而不能同步變量和類;
2)、每個對象只有一個鎖;當提到同步時,應該清楚在什麼上同步?也就是說,在哪個對象上同步?
3)、不必同步類中所有的方法,類可以同時擁有同步和非同步方法。
4)、如果兩個線程要執行一個類中的synchronized方法,並且兩個線程使用相同的實例來調用方法,那麼一次只能有一個線程能夠執行方法,另一個需要等待,直到鎖被釋放。也就是說:如果一個線程在對象上獲得一個鎖,就沒有任何其他線程可以進入(該對象的)類中的任何一個同步方法。
5)、如果線程擁有同步和非同步方法,則非同步方法可以被多個線程自由訪問而不受鎖的限制。

6)、線程睡眠時,它所持的任何鎖都不會釋放。

7)、線程可以獲得多個重進入(synchronized )鎖。比如,在一個對象的同步方法裏面調用另外一個對象的同步方法,則獲取了兩個對象的同步鎖。

 

8)、同步損害併發性,應該儘可能縮小同步範圍。同步不但可以同步整個方法,還可以同步方法中一部分代碼塊。
9)、在使用同步代碼塊時候,應該指定在哪個對象上同步,也就是說要獲取哪個對象的鎖。

同步方法:
1):同步靜態方法:某個類Object中的某個靜態方法staticMethod加上同步鎖之後,當某個線程Thread調用staticMethod時該線程會獲取Object的鎖(當前Object的鎖沒被其它線程獲取時,若當前Object鎖被其它鎖獲取則會進行等待。),此時其他任何線程在Thread釋放鎖前都無法調用Object類中任何的同步靜態方法。
2):同步非靜態方法:某個類Object中的某個非靜態方法Method加上同步鎖之後,當某個線程Thread調用Method時會獲取所對應的Object對象的鎖,此時其他線程在Thread釋放鎖前都無法調用改對象中的任何同步非靜態方法(所有非靜態同步方法都共用其所屬的對象的鎖)
3):兩者區別
前提:Object 中包含靜態同步方法staticMethod01,staticMethod02 , 非靜態同步方法Method01 , Method02,線程Thread1 和 Thread2:
Object obj1 = new Object();
Object obj2 = new Object();
a.當Thread1調用obj1.Method01()時,若Thread2想調用obj1.Method01()或者obj1.Method01()都需要先等待obj1.Method01()執行完釋放鎖才能進行調用。
b.當Thread1調用obj1.Method01()時,Thread2可以不用等待Thread01釋放鎖即可調用obj2.Method01()或者 obj2.Method02();
因爲非靜態同步方法的鎖是相對於對象而言
c.當Thread1 調用obj1.staticMethod01()時,Thread2不管是調用obj1.staticMe01()還是obj2.staticMethod01()都需要等待Thread1釋放鎖後才能進行調用。
因爲靜態同步方法的鎖是相對於類而言

同步代碼塊跟同步方法的異同:
1.同步方法是指對整個方法進行加鎖同步,而同步塊是指對方法內的某個代碼塊進行加鎖同步。
2.同步方法的鎖用的是其實例對象本身,而同步代碼塊的鎖可以自己指定。

目前理解的就這麼多了,希望各位多多指出錯誤和欠缺的地方。
發佈了35 篇原創文章 · 獲贊 133 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章