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

我的代码是线程安全的吗?如果没有,如何实现线程安全?

我的代码是线程安全的吗?如果没有,如何实现线程安全?

不负相思意 2022-10-20 16:56:24
我在一次采访中被问到一个问题。如果我想像这样在地图中存储值该怎么办:key_1 --> value 1key_2 --> value 2key_1 --> value 3在这里,如果我们假设键和值都在字符串中,那么我们应该像这样使用映射..Map<String,List<String>> m1 = new HashMap();然后有人问我如果要实现线程安全怎么办?然后我说我们可以为此目的使用ConcurrentHashMap ..他们说好的..然后他们问值我的意思是 List 是线程安全的吗?前任。t1.get("key_1").put("value_4");    t2.get("key_1").put("value_5");在这里,假设线程 t1 和 t2 都在并行运行。那么,如果List<String>我的意思是ConcurrentHashMap中的值是线程安全的?如果是,那怎么办?如果没有,那么如何实现呢?
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

ConcurrentHashMap是线程安全的数据结构。如果您List<String>在值中使用(不是线程安全的),ConcurrentHashMapList不是线程安全的,因为两个线程可以保护列表的引用,然后并行修改它。

ConcurrentHashMap是线程安全的意味着它的操作putputAll等是线程安全的。这并不意味着您用作其值的数据结构也成为线程安全的。

如何做到这一点?

  • 在你List<String>的.CopyOnWriteArrayListConcurrentHashMap

  • 进行自定义List并制作他们的所有方法Synchronized

  • 通过传入将非线程安全转换List为线程安全。ListCollections.synchronizedList(non-Thread safelist)


查看完整回答
反对 回复 2022-10-20
?
呼如林

TA贡献1798条经验 获得超3个赞

我说我们可以为此目的使用 ConcurrentHashMap ..他们说好的..

也许没关系,也许不行。这取决于key_1和key_2之间是否有特殊关系。

假设一个线程为 key_1 存储了一个新值,然后就在它可以为 key_2 存储相关值之前,它的时间片结束。然后另一个线程在第一个线程挂起时检查 key_1 和 key_2 的值。它看到 key_1 的新值,但看到 key_2 的值。

在那一点上,第一个线程只完成了更新两个键的一半是否重要?

插入 aConcurrentHashMap将确保 map 数据结构本身在多线程应用程序中不会做任何有趣或错误的事情,但如果应用程序依赖于这两个键总是一起更新,那么你仍然需要某种显式锁定以确保它们始终一起更新。


查看完整回答
反对 回复 2022-10-20
  • 2 回答
  • 0 关注
  • 116 浏览

添加回答

举报

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