- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以,这是我们(我和我的同事)在这里面临的经典并发问题。我们并不偷懒,我们带来了一些相关代码,以便您可以适本地帮助我们。我们有两个定义 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/
我无法理解为什么第一个读者-作者问题会导致写进程饿死,即:代码如何为读者进程提供优先级?当其中一个读取进程执行 signal(wrt) 时,写入进程是否应该无法获得锁定?是信号量列表的结构(正如我所看
我正在使用R处理人口普查数据,该数据使用了很长的数字GEOID来标识地理位置。我面临的问题是,当使用write_csv(来自readr包)写出处理后的数据时,正在以科学计数法编写这些GEOID。有办法
我为 Java 中的读写器问题开发了一个解决方案(有关此的一些信息 http://lass.cs.umass.edu/~shenoy/courses/fall08/lectures/Lec11.pdf
以下代码是Java中的Passing the Baton程序的一部分: 主要 P1(作家) P2(作家) P3(阅读器) P4(阅读器) 主要(); package ReadersPreference
我正在使用 ReaderWriterLockSlim保护一些操作。我想偏爱读者而不是作者,这样当读者长时间持有锁并且作者试图获取写锁时,进一步的读者不会被作者的尝试阻塞(如果作者在 lock.Ente
我觉得这可能是一种非常普遍和常见的情况,存在众所周知的无锁解决方案。 简而言之,我希望有像读者/作者锁这样的方法,但这不需要读者获取锁,因此可以获得更好的平均性能。 相反,读者需要一些原子操作(128
我遇到了读者-作者问题。我想写出作家喜欢使用互斥锁的解决方案。到目前为止我已经写了这个 #include #include #include #include #include #inclu
这个程序读取“电子邮件”(实际上只是一个像电子邮件一样结构的 .txt 文件)并用它做各种事情(在 map 中存储数据并对其进行操作)。 但是,我在根据主题搜索输出电子邮件的“消息”时遇到了一个不寻常
我正在从 UIWebView 切换到 WKWebView,不知道如何设置我的配置以使用 Reader. 有没有人可以帮助我? viewDidLoad: WKWebViewConfiguration *
我正在练习 Visual Basic 编程我在 Visual Basic 中有两种形式。第一个表单有一个命令按钮,将显示第二个表单的输入数据第二种形式有一个文本框,我需要在其中输入数据并保存它。 我在
我想寻求有关此任务的帮助。 我的任务是用 C 编写一个简单的程序来模拟读写器问题。程序要求是: 程序启动后,会要求用户输入作者和读者的输入次数。 程序会不断通知用户线程的状态。 程序结束后,小统计(每
我有一个用 C 语言模拟读者-作者问题的简单程序。要求用户输入作者数和读者数。然后创建随机数的编写器 - 线程和读取器 - 线程。项目的写入由全局变量 itemsCount 模拟 - 它代表新插入项目
我有一个“静态 64 位整数变量”,它仅由一个线程更新。所有其他线程仅从中读取。 出于安全原因,我是否应该使用原子操作(例如“__sync_add_and_fetch”)来保护这个变量? 还是可以直接
我是一名优秀的程序员,十分优秀!