簡體   English   中英

java 多寫多讀鎖

[英]java multiple writers and multiple readers locks

我正在嘗試實現一個遵循以下約束的系統:

  • 我有一個共享資源,例如原子數組
  • 我想同時支持從數組中進行多次讀取。
  • 我想同時支持對數組的多次寫入
  • 我不希望讀寫操作同時發生。

我發現 [this][1] stackoverflow post 關於類似的目標,但我認為解決方案建議允許同時讀取和寫入:

Class ReadAndWrite {
 private ReentrantLock readLock;
 private ReentrantLock writeLock;
 private AtomicInteger readers;
 private AtomicInteger writers;
 private File file;

 public void write() {
   if (!writeLock.isLocked()) {
    readLock.tryLock();
    writers.incrementAndGet(); // Increment the number of current writers
    // ***** Write your stuff *****
    writers.decrementAndGet(); // Decrement the number of current writers
    if (readLock.isHeldByCurrentThread()) {
     while(writers != 0); // Wait until all writers are finished to release the lock
     readLock.unlock();
    }
   } else {
     writeLock.lock();
     write();
   }
  }

 public void read() {
   if (!readLock.isLocked()) {
    writeLock.tryLock();
    readers.incrementAndGet(); 
    // ***** read your stuff *****
    readers.decrementAndGet(); // Decrement the number of current read
    if (writeLock.isHeldByCurrentThread()) {
     while(readers != 0); // Wait until all writers are finished to release the lock
     writeLock.unlock();
    }
   } else {
     readLock.lock();
     read();
   }
  }

如我所見,此代碼允許同時讀取和寫入,例如:兩個線程將嘗試同時讀取/寫入。 如果在寫/讀中,他們每個人都將進入第一個。 如何確保寫入阻止讀取和讀取阻止寫入? [1]: 多讀多寫(我的意思是多)同步

與其反復檢查鎖,不如嘗試使用它:

private void writeInternal() {
    //thread-unsafe writing code
}

public void write() {
    if (!writeLock.tryLock()) {
        writeLock.lock();
    }
    try {
        this.writeInternal(); //in try-block to ensure unlock is called
    } finally {
        writeLock.unlock();
    }
}

使用 readLock 將是一種類似的方法。 您還想確保您真正使用的是讀/寫鎖,而不僅僅是兩個單獨的鎖:

private final ReadWriteLock lock;

public ReadAndWrite() {
    this.lock = new ReentrantReadWriteLock();
}

然后您將通過this.lock.readLock()等訪問讀/寫鎖。

暫無
暫無

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

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