2010-02-21 9 views
4

У меня есть два потока, и я хочу убедиться, что правильно выполняю синхронизацию на LinkedBlockingQueue. Правильно ли это? Или явная синхронизация на (messageToCommsQueue) не нужна?Нужна ли вам явная синхронизация?

Декларация:

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(); 
       } 



      } 
     } 

    }); 

ответ

3

Да, это не нужно. JavaDoc говорит, что:

Блокирующие реализации Queue являются потокобезопасными.