Как правильно синхронизировать на LinkedList? - PullRequest
0 голосов
/ 28 апреля 2019

Я редактирую LinkedList и получаю предупреждения, потому что моя синхронизированная переменная не является окончательной. Как мне сделать эту тему безопасной?

Я пытаюсь выполнить синхронизацию на LinkedList и получаю предупреждение от моей среды IDE, в котором говорится, что синхронизация на неоконечном поле вряд ли будет полезна.

Я пробовал закрытый объект блокировки, однако, когда я синхронизируюсь, используя это, я получаю следующее исключение: java.lang.IllegalMonitorStateException

    protected List<ServerDataEvent> _queue = new LinkedList<>();

    synchronized (_queue) {
        while(_queue.isEmpty()) {
            try {_queue.wait(); } catch (InterruptedException e) {}
        }
        dataEvent = _queue.remove(0);
    }

Я бы хотел сделать этот поток безопасным, но я не смогу заставить программу работать, пока я не синхронизируюсь на LinkedList. Кто-нибудь может дать указания на то, что мне нужно сделать, чтобы решить эту проблему? Спасибо

1 Ответ

2 голосов
/ 28 апреля 2019

Я пытаюсь выполнить синхронизацию в LinkedList и получаю предупреждение от моей IDE о том, что синхронизация в неконечном поле вряд ли будет полезна.

Просто объявитепеременная должна быть final.

Проблема в том, что если что-то назначает новое значение полю, то потоки, которые используют переменную для синхронизации, могут в конечном итоге использовать другой объект.Если они это сделают, они могут не синхронизироваться правильно.

(Возможно, вы думаете, что объявление переменной как final означает, что вы не можете изменить список. Это не так. Вы можете добавлять и удалять элементы в список final. Вы просто не можете назначитьновое значение для переменной , т. е. сделать так, чтобы оно указывало на другой экземпляр списка.)

Я пробовал закрытый объект блокировки, однако при синхронизации с использованием этого я получаю следующееисключение: java.lang.IllegalMonitorStateException

Это другая проблема.

Наиболее вероятно, что поток вызывает wait или notify на объекте, когда он не содержит мьютекс объекта.Вы получите это независимо от того, какой тип объекта вы используете в качестве блокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...