![](/img/trans.png)
[英]Writing Multiple Flat Files with Item Readers And Writers Spring Batch
[英]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.