java map size()_java – ConcurrentHashMap包含值,但size()方法返...

遇到ConcurrentHashMap的奇怪行为:首先,使用比较和设置操作(如putIfAbsent()和remove()),几个线程会同时修改映射.经过一段时间(几十秒甚至一分钟)后,另一个线程使用两种方法检查地图是否为空:

>调用myMap.isEmpty()方法

>试图查看迭代器中是否有任何条目:myMap.entrySet().iterator().hasNext()

令人惊讶的是,这两种方法给出了不同isEmpty()返回true,iterator.hasNext()在此之后返回true.执行调用时没有任何暂停,此时不对地图执行写操作.

请注意,根据日志,isEmpty()返回false并且iterator.hasNext()同时返回false时不会出现这种情况.因此,总是isEmpty()方法不会“看到”地图中的任何条目.

不知道这是否是ConcurrentHashMap的预期行为.

文件指出:

Bear in mind that the results of aggregate status methods including size, isEmpty, and containsValue are typically useful only when a map is not undergoing concurrent updates in other threads. Otherwise the results of these methods reflect transient states that may be adequate for monitoring or estimation purposes, but not for program control.

这使得在没有正在进行的写操作时,期望像size()和isEmpty()这样的方法返回与地图的实际内容一致的值.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值