[英]synchronized lock on object
我對與Java方法同步和對象鎖定有關的事情感到好奇。
當您調用同步方法時,據我了解,它在方法調用期間會鎖定整個對象。
這是否意味着您只需要同步將數據寫入對象的方法,而無需同步從對象中讀取數據的方法?
public class testclass {
private ArrayList<String> data;
public ArrayList<String> getData() {
return data;
}
public synchronized void setData(ArrayList<String> data) {
this.data = data;
}
}
基本上上述代碼是線程安全的(由於運行setData方法時testclass對象已鎖定)? 還是我也應該同步getData方法?
這是否意味着您只需要同步將數據寫入對象的方法,而無需同步從對象中讀取數據的方法?
否-如果您不同步讀取,則沒有任何可見性保證(可能會獲得該對象的陳舊版本)。
注意:在您的情況下,您不需要使用synced關鍵字,因為每種方法都是原子的-您可以簡單地使data
易失。
鎖不是鎖定對象本身,而是與對象關聯的監視器。 在您的情況下,即使方法getData的同步也不能使testclass線程安全,因為它將“數據”字段的實例返回到野生世界,並且許多線程可能以不可預測的順序對對象執行其所需的任何操作。
為了遵循“可見性”,您要么需要使“數據”變得易變,要么同步這兩種方法-因為JVM可以自由地以任何方式優化字節碼,這使得某些線程可以看到“陳舊的”數據。
如果不synchronize
getData()
方法,那么當一個線程首先調用getData()
而另一個線程要執行writeData()
方法時,您可以保證沒有鎖定該線程。 因此不是線程安全的。
[EDIT]並且如其他規定,返回非易失性Data對象也不是線程安全的,可以在此類之外的非線程安全方式中對其進行修改
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.