同步数据结构

时间:2014-07-11 18:54:27

标签: java multithreading

当我使用BlockingQueue将表示复杂数据结构的对象从线程A传输到线程B时会发生什么。假设我在将其放入队列后不再从A访问数据结构。

这样安全吗?整个数据结构是递归同步还是只是我放入队列的一个对象。 如果我通过队列发送数组怎么办?

1 个答案:

答案 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可见。没有什么"递归"关于它。

所以,无论如何,如果你的意思是"递归同步",那么答案是肯定的。