猿问

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

我在一次采访中被问到一个问题。如果我想像这样在地图中存储值该怎么办:


key_1 --> value 1

key_2 --> value 2

key_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中的值是线程安全的?如果是,那怎么办?如果没有,那么如何实现呢?


不负相思意
浏览 117回答 2
2回答

肥皂起泡泡

ConcurrentHashMap是线程安全的数据结构。如果您List<String>在值中使用(不是线程安全的),ConcurrentHashMap则List不是线程安全的,因为两个线程可以保护列表的引用,然后并行修改它。ConcurrentHashMap是线程安全的意味着它的操作put和putAll等是线程安全的。这并不意味着您用作其值的数据结构也成为线程安全的。如何做到这一点?在你List<String>的.CopyOnWriteArrayListConcurrentHashMap进行自定义List并制作他们的所有方法Synchronized。通过传入将非线程安全转换List为线程安全。ListCollections.synchronizedList(non-Thread safelist)

呼如林

我说我们可以为此目的使用 ConcurrentHashMap ..他们说好的..也许没关系,也许不行。这取决于key_1和key_2之间是否有特殊关系。假设一个线程为 key_1 存储了一个新值,然后就在它可以为 key_2 存储相关值之前,它的时间片结束。然后另一个线程在第一个线程挂起时检查 key_1 和 key_2 的值。它看到 key_1 的新值,但看到 key_2 的旧值。在那一点上,第一个线程只完成了更新两个键的一半是否重要?插入 aConcurrentHashMap将确保 map 数据结构本身在多线程应用程序中不会做任何有趣或错误的事情,但如果应用程序依赖于这两个键总是一起更新,那么你仍然需要某种显式锁定以确保它们始终一起更新。
随时随地看视频慕课网APP

相关分类

Java
我要回答