簡體   English   中英

同步鎖定對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM