我必须同步访问封装线程安全的数据结构在Java中?
-
19-09-2019 - |
题
说我有这样的事情(和我)
class QueBean extends JPanel {
private Queue queue = new LinkedBlockingQueue();
public Object poll(){
return queue.poll();
}
}
与其中的一些,关于自己的线程中运行
class ConsumerBean extends JPanel implements Runnable{
private QueBean queBean;
public synchronized run(){
while (true) {
Object result = queBean.poll();
if (result != null) {
jResultTextField.setText("got one");
}
wait(500);
}
}
}
应该我在poll()
QueBean
被synchronized
或不?
解决方案
外部同步不是必要在这种情况下。阅读 BlockingQueue
合同:
BlockingQueue实现是 线程安全的。所有排队方法 达到其效果原子使用 内部锁或其他形式的 并发控制。
其他提示
有一个线程的问题,而不是一个你想 - 你发布的代码几乎可以肯定是非法的,并最终锁定了
一摆动的核心规则是只有一个线程被允许触摸“实现”的组件。 (在屏幕上或屏幕上的“几乎”实现方式)。
此:
jResultTextField.setText("got one");
在一个线程是相当肯定是错误的 - 你不能做到这一点。检查出的invokeLater或invokeAndWait让你的屏幕更新到您的AWT线程。
顺便说一句 - 那感觉好笑具有任何线程延伸的组成部分 - 导致我立即搜索冲突是地方见状,但它应该作出任何长期Java程序员不安在glance--我建议你分手了你的一些类和驱动部分完全分离你的图形用户界面(控制器)从GUI(查看)..
没有。没有必要。由于您的poll
方法不做任何事,除了调用线程安全的方法,也没有数据损坏的可能性。
您不需要做这个,只要queue
不QueBean
改变。
另外,除非你想实现某种琐碎率limitng的,你不需要在代码中wait(500)
。这是多余的,由于队列中阻塞。
不隶属于 StackOverflow