我想做的是实现特定于密钥的读写锁。如果该键上没有写请求,则可以同时执行多个读请求。对不同键的放置请求可以同时执行。 我使用了ConcurrentHashMap来保存密钥,并记录每个密钥的运行写入操作。
我的代码如下:
ConcurrentHashMap<String, AtomicInteger> count;
...
...
public void getLock(){
synchronized (count.get(key)) {
while (count.get(key).get() != 0) { // this means there are GET
requests running
try {
count.get(key).wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
这个想法是,当一个新线程想要读取时,它需要首先检查该键上是否有任何写操作(如果计数不为0),如果没有,它可以继续进行,如果是,则需要等待。
所以我想我必须使用count.get(key).wait();
。但是,Java强迫我使用synchronized (count.get(key))
方法来wait()
。
我想知道既然已经使用AtomicInteger在这里使用同步了吗?
p.s。
以后我的解锁方法中确实有notify()
。
答案 0 :(得分:0)
我刚刚意识到为什么我仍然需要AtomicInteger的同步块。 所有评论以及this link都非常有用。
如果服务员没有同步,那么任何旧的代码都可能 在睡觉之前更改谓词,然后我们 肯定有麻烦。
因此,即使它是AtomicInteger(实际上,值的数据类型并不重要),在等待之前,另一个线程也可以更改其值,这是错误的。