gpt4 book ai didi

java - 新线程是否具有所有其他线程先前对共享对象的操作的完全内存可见性?

转载 作者:行者123 更新时间:2023-12-01 16:51:17 25 4
gpt4 key购买 nike

我有线程A维护数据结构(在ConcurrentHashMap中添加、删除、更改值)。

我有线程 B 监听套接字,偶尔创建线程 C 来处理新的客户端连接。

所有线程C都只能从线程A维护的ConcurrentHashMap中读取(从不更新它)。

线程C是否保证能看到线程A在线程C<之前在ConcurrentHashMap上执行的所有更新/strong> 是由线程 B 创建/启动的?

(编辑最后一句以使问题更清楚:只关心 ConcurrentHashMap 的更新。)

最佳答案

Is thread C guaranteed to see all updates that were performed by thread A before thread C was created/ started by thread B?

一般情况下(例如,使用普通的 HashMap),不会。

但是(同样是一般情况)如果线程 C 是由线程 A 创建的,那么答案是肯定的。

(一个线程在线程对象上调用 start() 与新线程的 run() 开始之间存在一种发生在关系 方法。但是您引入了第三个线程...并且没有描述任何可以为您提供从 A 到 B 到 C 的 happens-before 链的内容。)

<小时/>

但是,您在这里讨论的是 ConcurrentHashMap,并发映射具有天生的内存一致性:

"Memory consistency effects: As with other concurrent collections, actions in a thread prior to placing an object into a ConcurrentMap as a key or value happen-before actions subsequent to the access or removal of that object from the ConcurrentMap in another thread."

(来自ConcurrentMap javadoc。)

因此,对于多个线程共享 ConcurrentHashMap 的任何情况,只读线程都保证可以看到另一个线程所做的更新......以迭代器的记录行为为模。

关于java - 新线程是否具有所有其他线程先前对共享对象的操作的完全内存可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39615742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com