0

我要做的是实现一个特定于密钥的读写锁。如果该键上没有写入请求,则可以同时执行多个读取请求。可以同时执行对不同键的请求。我使用 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?

ps 我确实有notify()后来的解锁方法。

4

1 回答 1

0

我刚刚意识到为什么我仍然需要 AtomicInteger 的同步块。所有评论以及此链接都非常有用。

如果服务员没有同步,那么任何旧代码都可能在谓词进入睡眠之前更改谓词,那么我们肯定有麻烦了。

所以即使它是 AtomicInteger (实际上,值的数据类型并不重要),就在它等待之前,另一个线程可以改变它的值,它会是错误的。

于 2019-03-28T01:41:24.867 回答