这需要显式同步吗? [英] Does this need explicit synchronization?
本文介绍了这需要显式同步吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有两个线程,我想确保我在LinkedBlockingQueue上正确进行同步..这是正确的吗?或者是否必须在(messageToCommsQueue)上显式同步?
I have two threads, and I want to make sure I am doing the synchronization correctly on the LinkedBlockingQueue.. Is this correct? Or is the explicit synchronization on (messageToCommsQueue) not necessary?
声明:
private LinkedBlockingQueue<BaseMessage> messagesToCommsQueue;
方法一:
private void startOperationModeStatusMessageExecutor() {
ScheduledExecutorService operationModeStatusExecutor = Executors.newSingleThreadScheduledExecutor();
operationModeStatusExecutor.scheduleAtFixedRate((new Runnable() {
@Override
public void run() {
MT02OperationModeStatusMessage commsOperateMsg;
commsOperateMsg = MessageFactory.getMT1102OperationModeStatusMessage(status.ordinal());
synchronized (messagesToCommsQueue) {
messagesToCommsQueue.add(commsOperateMsg);
}
}
}), 0, 10, TimeUnit.SECONDS);
}
方法二:
Executor commsSenderExecutor = Executors.newSingleThreadExecutor();
commsSenderExecutor.execute(new Runnable() {
@Override
public void run() {
while (getStatus().equals(OperationModeStatus.INITIATE) || getStatus().equals(OperationModeStatus.OPERATE)) {
BaseMessage m = null;
try {
synchronized (messagesToCommsQueue) {
m = messagesToCommsQueue.take();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
推荐答案
是的,没有必要。 JavaDoc 说:
Yes, it's not necessary. JavaDoc says that:
BlockingQueue实现是线程安全的。
BlockingQueue implementations are thread-safe.
这篇关于这需要显式同步吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文