当我使用BlockingQueue将表示复杂数据结构的对象从线程A传输到线程B时会发生什么?假设我在将数据结构放入队列后不再从A访问数据结构。
这安全吗?整个数据结构是递归同步的,还是仅是我放入队列的一个对象。如果我在队列中发送一个数组呢?
发布于 2014-07-11 20:54:13
整个数据结构会递归同步吗.?
这取决于您所说的“递归同步”是什么意思。我希望他们为synchronized关键字选择了一个不同的名字。它做了两件事:
(1)互斥:不允许两个线程同时在同一对象上同步。
(2)内存可见性:如果线程A更新一个或多个字段,然后退出一个同步块,然后线程B随后在同一个对象上同步,则线程B将保证看到线程A所写的新值。
这就是synchronized所做的一切。
如果您的线程A更新了一个复杂的数据结构,然后将对它的引用放入一个java.util.concurrent.BlockingQueue中,那么put/add/ something方法应该做一些相当于输入和离开一个同步块的事情。线程B调用的删除/轮询/取方法也应该这样做。因此,只要线程A在调用put()/add()/offer()之后不更新结构,那么线程B就能够看到线程A更改的每个字段。
线程A更改的每个字段:排队对象的字段、可以从排队对象访问的对象字段以及完全无关对象的字段。正确的同步使得线程A在堆中所做的所有更改对线程B都是可见的。
因此,无论如何,如果这就是所谓的“递归同步”,那么答案是肯定的。
https://stackoverflow.com/questions/24704604
复制相似问题