我想实现自己的readWriteLock
课程,而不使用API提供的readWriteLock
。
我遇到这种情况:
public void read(){
if(!write){
read = true;
//any thread can enter here and read;
....
read = false;
}
}
public syncrhonized void write(){
if(!read){
write = true;
//only one thread at time can write.
....
write = false;
}
}
此代码可能会出现许多不良情况,例如:
if(!read){...}
内部并立即变为真,那么它就无法写入。if(!write){...}
内部并立即变为真,那么他们就无法阅读。我设法使用atomicBoolean
,但这对于同时想要阅读的所有主题都是mutex - exclusion
,而这并不能解决歧义。
有人能给我一个解释吗?
提前感谢。
答案 0 :(得分:1)
你要做的不是一个好主意。正如您自己已经提到的那样,已有一种现有的机制。为什么重新发明轮子?
如果您确实需要自己的实现,要正确执行,需要更多同步块。您需要同步获取和释放读锁定,您不仅可以同步访问write方法。
我没有检查但看起来很好的例子。所有学分归Jakob Jenkov(http://tutorials.jenkov.com/java-concurrency/read-write-locks.html)
public class ReadWriteLock{
private int readers = 0;
private int writers = 0;
private int writeRequests = 0;
public synchronized void lockRead() throws InterruptedException{
while(writers > 0 || writeRequests > 0){
wait();
}
readers++;
}
public synchronized void unlockRead(){
readers--;
notifyAll();
}
public synchronized void lockWrite() throws InterruptedException{
writeRequests++;
while(readers > 0 || writers > 0){
wait();
}
writeRequests--;
writers++;
}
public synchronized void unlockWrite() throws InterruptedException{
writers--;
notifyAll();
}
}