簡體   English   中英

java方法同步與讀寫互斥

[英]java method synchronization and read/write mutual exclusion

我在一個類中有兩個方法read()write()如下。

class Store
{

  public void write()
  {
    // write to store;
  }

  public string  read()
  {
    // read from store;
  }
}

1) Store對象是一個單例。

2)我有一個Writer類將寫入商店和幾個Reader類將同時從商店讀取。

我的要求是,當作者向商店寫信時,所有讀者都應該等待。 即,當控制在write() ,所有對read()的調用都應該被阻止。 我如何實現這一目標? 我在write()方法中嘗試過synchronize(Store.class) ,但似乎對我不起作用。

在這種情況下,最好的選擇是使用讀寫鎖: ReadWriteLock 它允許單個寫入器,但允許多個並發讀取器,因此它是此類場景的最有效機制。

一些示例代碼:

class Store
{
    private ReadWriteLock rwlock = new ReentrantReadWriteLock();

    public void write()
    {
       rwlock.writeLock().lock();
       try {
          write to store;
       } finally {
          rwlock.writeLock().unlock();
       }
    }

    public String read()
    {
       rwlock.readLock().lock();
       try {
          read from store;
       } finally {
          rwlock.readLock().unlock();
       }
    }
}

synchronized是最簡單的解決方案,因此您應該解釋“對我來說似乎不起作用”的意思,並可能向我們展示您如何使用它。

更好的解決方案是使用ReentrantReadWriteLock,因為它也允許並發訪問讀者。

當某個對象上的方法同步時,執行此方法的線程會阻止所有其他線程嘗試進入在同一對象上同步的另一個塊/方法。

因此,如果您希望寫入線程禁止任何讀取線程讀取,您必須同步寫入和讀取方法。 沒有理由在Store類上進行同步。 Store對象上同步更自然:

public synchronized void write() {
  write to store;
}

public synchronized String read() {
  read from store;
}

然而,這(也許)有一個缺點:它也禁止兩個讀取器線程同時讀取。 如果你真的需要這種情況發生,你應該使用ReadWriteLock 但這會導致代碼性能下降,更難理解和維護。 如果我已經測量到需要這樣做,我只會使用它。

使用 java.util.concurrent 包中的 ReadWriteLock

請注意閱讀這篇文章:

https://blog.takipi.com/java-8-stampedlocks-vs-readwritelocks-and-synchronized/

  • RWLocks 可能很慢,尤其是當有很多讀者到作者時
  • 同步平均是最可靠的快速
  • 有像 StampedLock 這樣的新鎖

暫無
暫無

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

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