当我们想使用map.get(key).wait()时,当值是AtomicLong时同步map.get(key)真的有意义吗?

时间:2019-03-28 01:10:19

标签: java multithreading atomicinteger

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

1 个答案:

答案 0 :(得分:0)

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

  

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

因此,即使它是AtomicInteger(实际上,值的数据类型并不重要),在等待之前,另一个线程也可以更改其值,这是错误的。