簡體   English   中英

ReadWriteLock是否不必渲染synchronized關鍵字?

[英]Does a ReadWriteLock render the synchronized keyword unnecessary?

正如在這個問題的幾個答案中所建議的:

這種鎖定技術的名稱是什么?

我實現了一個ReentrantReadWriteLock並且看到了一個很好的加速(我知道在我的一個類中有一些鎖爭用並且使用重入鎖確實有助於加快速度)。

但現在我想知道:如果在一個類中,所有訪問(讀取和寫入)都是通過首先鎖定讀鎖定或寫鎖定來完成的,是否意味着不應該在該類中使用synchronized關鍵字?

例如,這是http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html上的一個官方Java 1.6示例。

class RWDictionary {
    private final Map<String, Data> m = new TreeMap<String, Data>();
    private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    private final Lock r = rwl.readLock();
    private final Lock w = rwl.writeLock();

    public Data get(String key) {
        r.lock();
        try { return m.get(key); }
        finally { r.unlock(); }
    }
    public String[] allKeys() {
        r.lock();
        try { return m.keySet().toArray(); }
        finally { r.unlock(); }
    }
    public Data put(String key, Data value) {
        w.lock();
        try { return m.put(key, value); }
        finally { w.unlock(); }
    }
    public void clear() {
        w.lock();
        try { m.clear(); }
        finally { w.unlock(); }
    }
 }

沒有synchronize關鍵字。

現在我意識到這種鎖的一個要點是比其他方法更快(在這種情況下比同步更快)但這背后的技術解釋是什么?

在每個get / update方法的類中使用讀寫鎖是否“替換”這些方法的synchronize關鍵字?

如果您在ReadWriteLock和Lock上讀取了javadoc,他們特別指出Locks必須提供與synchronized關鍵字相同的內存語義:

所有Lock實現必須強制執行內置監視器鎖提供的相同內存同步語義,如Java語言規范,第三版(17.4內存模型)中所述:

(那是來自Lock javadoc; ReadWriteLock引用Lock來描述它的語義。)

所以,是的,它取代了synchronized關鍵字。 事實上,你可以用一個Lock替換你代碼中的每個synchronized塊並具有相同的語義(並且,取決於jvm,甚至可能是一個小的性能提升。)但是你要以更快的速度交易一點速度如果您忘記解鎖其中一個鎖,您可能會使程序死機。

許多這方面的功能是非阻塞算法( 比較和交換是它們的核心)與volatile字段的內存語義相結合,指定如果寫入volatile字段,隨后讀取該字段的任何線程都必須至少看到你寫作時所看到的世界狀況。 (他們也可以看到寫完之后發生的部分或全部內容。)這些工具可以制作一些非常快速的代碼,但它們也很微妙且容易出錯 - 幾乎總是最好留在更高級別構造(例如您正在使用的ReadWriteLock)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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