当我使用BlockingQueue将表示复杂数据结构的对象从线程A传输到线程B时会发生什么。假设我在将其放入队列后不再从A访问数据结构。
这样安全吗?整个数据结构是递归同步还是只是我放入队列的一个对象。 如果我通过队列发送数组怎么办?
答案 0 :(得分:1)
整个数据结构是否会递归同步......?
这取决于你的意思"递归同步。" IMO我希望他们为synchronized
关键字选择了不同的名称。它做了两件事:
(1)相互排斥:不允许两个线程同时在同一个对象上同步。
(2)内存可见性:如果线程A更新了一个或多个字段然后退出同步块,然后线程B随后在同一对象上同步,则线程B将保证看到线程A写的新值。
那就是synchronized
所做的一切。
如果你的线程A更新了一个复杂的数据结构,然后将它的引用放入java.util.concurrent.BlockingQueue,那么put / add / offer方法应该做一些等同于进入和离开synchronized块的东西。你的线程B调用的remove / poll / take方法也应该这样做。因此,只要线程A在调用put()/ add()/ offer()之后不更新结构,那么线程B应该能够看到线程A发生变化的每个字段。
线程A发生变化的每个字段:排队对象的字段,可从排队对象到达的对象字段以及完全不相关的对象字段。正确的同步使所有线程A在堆中所做的更改对线程B可见。没有什么"递归"关于它。
所以,无论如何,如果你的意思是"递归同步",那么答案是肯定的。