当我们想要使用map.get(key).wait()时,当值是AtomicLong时

我试图做的是实现一个特定于密钥的读写锁。如果该密钥上没有写入请求,则可以同时执行多个读取请求。可以将不同键上的 Put 请求同时执行。我使用 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),如果没有,它可以继续,如果是,它需要等待。所以我想我必须使用.但是,Java迫使我使用该方法。count.get(key).wait();synchronized (count.get(key))wait()


我想知道在这里使用同步是否有意义,因为我已经使用了AtomicInteger?


p.s. 我确实有解锁方法的后期。notify()


慕码人8056858
浏览 95回答 1
1回答

慕标5832272

我刚刚意识到为什么我仍然需要一个AtomicInteger的同步块。所有评论以及此链接都非常有用。如果服务员没有同步,那么任何旧的代码都可能在它进入睡眠状态之前更改谓词,然后我们肯定会遇到麻烦。因此,即使它是AtomicInteger(实际上,值的数据类型并不重要),就在它等待之前,另一个线程可以更改其值,这将是错误的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java