在线程之间传递可变数据

2022-09-02 23:55:48

这里有一个关于Java中多线程的基本问题:我有一个非常大的可变数据结构(确切地说是一棵树),我明白,如果我想从两个不同的线程同时修改这个数据结构,我需要使用锁和/或其他类型的线程安全。

但是,在我的情况下,两个线程不需要同时修改数据结构;相反,通常拥有数据结构的线程 A 应暂时将数据结构传递给线程 B,而线程 B 应在对线程 A 进行一些长时间运行的修改后将数据结构传递回线程 A。

如果保证线程不会同时修改数据,那么在线程之间来回传递此可变数据结构是否线程安全?


答案 1

如果您可以保证线程不会同时修改树(即通过原子传递对树的唯一引用),那么从线程安全的角度来看,这很好。

不过,数据可见性/一致性是另一个问题。除非树中的所有字段都(递归地)声明,否则一个线程所做的更改可能不会对另一个线程可见。为避免,请确保在线程交换树的所有权时获取监视器(充当内存屏障并确保所有写入操作都变得可见)。volatile


答案 2

是的,只要您在线程之间传递对象时采取特定步骤来避免内存一致性错误,您所描述的内容就可以正常工作。使用锁定是实现这一目标的一种方法,但还有其他更便宜的方法。

本教程是一个很好的起点。

基本上,您需要确保当线程 A 将对象传递给线程 B 时,A 的所有更改都会发生 - 在 B 访问对象之前。

JLS中还有更多内容,但技术性很强。


推荐