gpt4 book ai didi

java - 使用 java 信号量解决读者/作者问题

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:53:49 26 4
gpt4 key购买 nike

所以,这是我们(我和我的同事)在这里面临的经典并发问题。我们并不偷懒,我们带来了一些相关代码,以便您可以适本地帮助我们。我们有两个定义 Readers 和 Writers 的类,它们都扩展 Thread 类,并且当然会重写 run 方法,如下所示:

while(!isInterrupted()) {
try{
Thread.sleep(for some time)
}catch(InterruptedException e) {}

database.readLock();
readersWorking++; //for debugging purposes
database.readUnlock();
}

Writer 的运行方法几乎相同,但我们增加了 writersWorking,也是为了调试目的。

在我们的主要方法中,我们创建了 20 个读者和 2 个作者。他们都通过构造函数注入(inject)获得一个数据库类的实例。这是数据库:

class Database {
Semaphore writeMut = new Semaphore(1);
Semaphore readMut = new Semaphore(1);
private int readersWorking = 0;

public Database() {

}

public void readLock() {
readMut.acquireUninterruptibly();

if(readersWorking==0) //Am I the first one?
writeMut.acquireUninterruptibly();
readersWorking++;

readMut.release();
}

public void writeLock() {
writeMut.acquireUninterruptibly();
}

public void readUnlock() {
readMut.acquireUninterruptibly();
readersWorking--;
if(readersWorking==0) //Am I the last one?
writeMut.release();
readMut.release();
}

public void writeUnlock() {
writeMut.release();
}
}

问题:为什么这段代码会导致我们的读者访问数据库,而编写者仍在其中,反之亦然?我们怎么能否认这件事的发生呢?我们这里的逻辑有什么问题?我们也在寻找一本关于 Java 并发性的好书,如果有人知道的话。

以防万一提供的代码还不够,这里是完整的代码:http://codepad.org/IJ7e145C

最佳答案

我实际上没有心情彻底分析您的代码(懒惰,我知道 :p),但听起来 java.util.concurrent.locks 包有很多 exactly what you need .现在,除非您坚持使用 Java 1.4,否则我强烈建议您依靠 Java 并发实用程序来为您完成这项讨厌的工作。你会让自己更轻松。

至于这本书,它看起来像this will fit the bill .

关于java - 使用 java 信号量解决读者/作者问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8124481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com