Java同步方法

qq_28811941發表於2020-12-19

1.即有synchronized關鍵字修飾的方法。
由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時,
內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。
程式碼如:
public synchronized void save(){}
注: synchronized關鍵字也可以修飾靜態方法,此時如果呼叫該靜態方法,將會鎖住整個類

2.同步程式碼塊
即有synchronized關鍵字修飾的語句塊。
被該關鍵字修飾的語句塊會自動被加上內建鎖,從而實現同步
程式碼如:
synchronized(object){
}
注:同步是一種高開銷的操作,因此應該儘量減少同步的內容。
通常沒有必要同步整個方法,使用synchronized程式碼塊同步關鍵程式碼即可。

  1. 3.使用特殊域變數(volatile)實現執行緒同步
    a.volatile關鍵字為域變數的訪問提供了一種免鎖機制,
    b.使用volatile修飾域相當於告訴 虛擬機器該域可能會被其他執行緒更新,
    c.因此每次使用該域就要重新計算,而不是使用暫存器中的值
    d.volatile不會提供任何原子操作,它也不能用來修飾final型別的變數

注:關於Lock物件和synchronized關鍵字的選擇:
a.最好兩個都不用,使用一種java.util.concurrent包提供的機制,
能夠幫助使用者處理所有與鎖相關的程式碼。
b.如果synchronized關鍵字能滿足使用者的需求,就用synchronized,因為它能簡化程式碼
c.如果需要更高階的功能,就用ReentrantLock類,此時要注意及時釋放鎖,否則會出現死鎖,通常在finally程式碼釋放鎖 。

相關文章