java map删除key_java – HashMap.remove()通过在Key上使用String....

这不足以从多个线程安全地访问HashMap.事实上,它几乎可以保证打破某些东西.通过同步给定键,只要单独的线程使用不同的键,就可以同时不安全地修改映射.

考虑这三个线程是否试图同时运行:

Thread 1 Thread 2 Thread 3

synchronized("a") { synchronized("a") { synchronized("b") {

map.remove("a"); map.remove("a"); map.remove("b");

} } }

线程1和2将正确地等待彼此,因为它们在同一对象上进行同步(Java实习生字符串常量).但是线程3不受其他线程中正在进行的工作的阻碍,并且立即进入其同步块,因为没有其他人锁定“b”.现在两个不同的同步块同时与地图交互,所有投注都关闭.不久,你的HashMap将会被破坏.

Collections.synchronizedMap()正确地使用地图本身作为同步对象,因此锁定整个地图,而不仅仅是正在使用的键.这是防止从多个线程访问HashMap的内部损坏的唯一可靠方法.

ConcurrentHashMap通过在内部锁定地图中所有键的子集来正确地执行我认为您发布的代码正在尝试执行的操作.这样,多个线程可以安全地访问不同线程上的不同密钥,并且永远不会相互阻塞 – 但如果密钥恰好位于同一个存储桶中,则映射仍将阻塞.您可以使用concurrencyLevel构造函数参数修改此行为.

顺便说一句,让我们假设为了参数,synchronized(key.intern())是一种同时访问HashMap的合理方法.这仍然会非常容易出错.如果应用程序中只有一个地方无法在密钥上调用.intern(),那么一切都可能会崩溃.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值