首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步数据结构

同步数据结构
EN

Stack Overflow用户
提问于 2014-07-11 18:54:27
回答 1查看 2K关注 0票数 1

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

这安全吗?整个数据结构是递归同步的,还是仅是我放入队列的一个对象。如果我在队列中发送一个数组呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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都是可见的。

因此,无论如何,如果这就是所谓的“递归同步”,那么答案是肯定的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24704604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档