代码之家  ›  专栏  ›  技术社区  ›  mainstringargs

这需要显式同步吗?

  •  3
  • mainstringargs  · 技术社区  · 15 年前

    我有两个线程,我要确保在LinkedBlockingQueue上正确执行同步。这是正确的吗?或者不需要显式同步(messagetocommqueue)?

    宣言:

        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();
                    }
    
    
    
                }
            }
    
        });
    
    1 回复  |  直到 15 年前
        1
  •  3
  •   Igor Artamonov    15 年前

    是的,没有必要。 JavaDoc 说:

    BlockingQueue实现是线程安全的。