Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
写锁有优先权访问java读写锁中的关键区域吗?_Java_Multithreading_Concurrency_Readwritelock - Fatal编程技术网

写锁有优先权访问java读写锁中的关键区域吗?

写锁有优先权访问java读写锁中的关键区域吗?,java,multithreading,concurrency,readwritelock,Java,Multithreading,Concurrency,Readwritelock,我需要writers线程优先于readers线程访问关键区域,我可以使用ReadWriteLock接口来实现这一点吗?虽然不能直接使用ReadWriteLock,但最简单的内置方法可能是信号灯,它确实支持公平性。创建一个公平的信号灯,并(有效地)具有无限数量的许可证就足够了: 私有静态最终信号量锁=新信号量(Integer.MAX_值,true); public void doReadLocked()引发InterruptedException{ //“读取”锁只获得一个许可证,但由于有很多许可

我需要writers线程优先于readers线程访问关键区域,我可以使用ReadWriteLock接口来实现这一点吗?

虽然不能直接使用
ReadWriteLock
,但最简单的内置方法可能是
信号灯,它确实支持公平性。创建一个公平的
信号灯
,并(有效地)具有无限数量的
许可证
就足够了:

私有静态最终信号量锁=新信号量(Integer.MAX_值,true);
public void doReadLocked()引发InterruptedException{
//“读取”锁只获得一个许可证,但由于有很多许可证,
//他们中的许多人可以同时跑步。
lock.acquire();
试一试{
//在这里做你的事。。。
}最后{
//以后一定要释放。
锁定。释放();
}
}
public void doWriteLocked()引发InterruptedException{
//“写”锁需要所有许可证。由于设置了公平性,因此
//将“优先”于其他等待获取的“阅读者”
//许可证。
lock.acquire(整数最大值);
试一试{
//在这里做你的事。。。
}最后{
//以后一定要释放。
锁定释放(整数最大值);
}
}

当您说“具有优先级”时,当写入锁到达时,您希望当前在“读锁”下执行的任何内容发生什么情况?或者你只是想让一个“编写器”跳过队列,这样在编写器完成之前就不会有更多的“读取器”启动?我想让一个编写器跳过Java SE中的队列,它的文档中说:“这个类不会对锁访问强加读写器优先顺序。”第三方库中可能存在ReadWriteLock的其他实现,但Java SE似乎没有任何其他实现。@VGR:有两个(StampedLock也用作一个)。但两者都没有优先权。如果愿意,您可能可以使用ReadWriteLock编写一个解决方案,但可能有更简单的方法(例如,使用您已经提到的队列)。Java的非公平锁都是讨价还价锁,这意味着它们会在返回队列之前立即尝试获取。这不是优先级,而是在不需要公平性的情况下避免上下文切换的优化。公平锁速度较慢,但在需要保护某些线程免受饥饿时更可取。根据,信号量支持的唯一“公平性”是FIFO one:当多个线程等待一个信号量时,较早调用
.acquire()
的线程将获胜。因此,您对
lock.acquire(Integer.MAX_值)的注释看起来不正确。(“这将比其他等待获取许可证的“读”线程“优先”。)任何“读”线程都可以立即获取锁。因此,由于“写”锁现在是队列中的第一个锁,在该写锁完成之前,将无法获取更多的读锁。这是OP要求的行为。如果第二次写入在第一次写入时到达,那么可能还有更多的事情要处理。哦,明白了。但是你测试过你的代码吗?我希望
lock.acquire()
不会等待锁.acquire(Integer.MAX_值)但立即继续:公平只是等待。@Tsyvarev我试图在这里快速检查。看起来它按预期工作,但我可能把测试用例搞砸了。:/每个println开头方括号中的数字是我期望在该点的计数。这并不比公平模式下的
ReentrantReadWriteLock
好。当有一个挂起的
acquire(Integer.MAX_VALUE)
时,下一个
acquire()
将在它之后排队,就像有一个较旧的写锁尝试(在公平模式下)时挂起的读锁尝试将排队一样。但是当另一个
acquire(Integer.MAX_VALUE)
尝试到达时,它不会超过先前排队的
acquire()
尝试,因此仍然没有写入程序优先级。