Do they need explicit synchronization?

I have two threads and I want to make sure that I am synchronizing correctly in LinkedBlockingQueue. Is it correct? Or is explicit synchronization on (messageToCommsQueue) not necessary?

Declaration:

private LinkedBlockingQueue<BaseMessage> messagesToCommsQueue; 

First method:

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

Method Two:

  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(); } } } }); 
+4
source share
1 answer

Yes, it is not necessary. JavaDoc says that:

BlockingQueue implementations are thread safe.

+3
source

Source: https://habr.com/ru/post/1301978/


All Articles