为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人8056858 2022-09-07 17:10:58
我试图做的是实现一个特定于密钥的读写锁。如果该密钥上没有写入请求,则可以同时执行多个读取请求。可以将不同键上的 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()
查看完整描述

1 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

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

如果服务员没有同步,那么任何旧的代码都可能在它进入睡眠状态之前更改谓词,然后我们肯定会遇到麻烦。

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


查看完整回答
反对 回复 2022-09-07
  • 1 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信