【问题标题】:Serial Thread Confinement串行线程限制
【发布时间】:2015-02-21 19:15:07
【问题描述】:
我正在尝试在 java 中实现串行线程限制。我在线程 A 的 run 方法中创建了一个可变对象的引用。现在我想以这样一种方式将对象移交给线程 B,即只有线程 B 与对象互斥,并看到 A 对对象所做的修改(我可以通过安全地发布它来确保),但是如何我可以保证只有线程 B 可以访问该对象而其他线程都没有吗?书上说它可以使用阻塞队列来完成。任何人都可以帮助我实现这个功能
【问题讨论】:
标签:
java
multithreading
thread-safety
【解决方案1】:
您可以让线程 A 将对象放在 BlockingQueue 上,而线程 B 将其取出。在这种情况下,SynchronousQueue - 没有内部存储对象的能力 - 将是一个很好的选择,因为您只需要交换一个对象。这比 Exchanger 稍微容易一些,因为您只需要在一个方向上交换一个对象。它的 Javadoc 甚至提到“交换器可以被视为同步队列的双向形式”。
【解决方案2】:
您可以使用Exchanger 在两个线程之间共享。一个线程(线程 B)将发送 null 而另一个(线程 A)将发送所需的对象。所以线程 A 会安全地将对象发布到线程 B。