Нужна ли явная синхронизация? - PullRequest
3 голосов
/ 22 февраля 2010

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

Декларация:

    private LinkedBlockingQueue<BaseMessage> messagesToCommsQueue;

Метод первый:

private void startOperationModeStatusMessageExecutor() {

    ScheduledExecutorService operationModeStatusExecutor = Executors.newSingleThreadScheduledExecutor();
    operationModeStatusExecutor.scheduleAtFixedRate((new Runnable() {

        @Override
        public void run() {
            ModeStatusMessage commsOperateMsg;
                commsOperateMsg = MessageFactory.getModeStatusMessage(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(ModeStatus.INITIATE) || getStatus().equals(ModeStatus.OPERATE)) {
                BaseMessage m = null;
                try {
                    synchronized (messagesToCommsQueue) {
                        m = messagesToCommsQueue.take();
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }
        }

    });

1 Ответ

4 голосов
/ 22 февраля 2010

Да, это не обязательно. JavaDoc говорит, что:

Реализации BlockingQueue поточно-ориентированы.

...