я следующий код в потоке 1:Две нити, одновременно входящие в один ArrayList?
synchronized (queues.get(currentQueue)) { //line 1
queues.get(currentQueue).add(networkEvent); //line 2
}
и следующее в потоке 2:
synchronized (queues.get(currentQueue)) {
if (queues.get(currentQueue).size() > 10) {
currentQueue = 1;
}
}
Теперь мой вопрос: Переменная currentQueue в настоящее время имеет значение 0. Когда нить 2 изменяет значение currentQueue на 1, а поток 1 ожидает в строке 1 (из-за синхронизации), то поток 1 затем использует обновленное значение currentQueue в строке 2 после завершения потока 2 (это то, что я хочу).
Вы меняете его в локальном масштабе. – arynaq
Ваша синхронизация неисправна. Из вашего кода ключ для доступа к очереди (и у вас их много) кажется индексом currentQueue.Это то, что вы должны регулировать доступ (и, в конечном счете, синхронизацию), особенно когда он доступен в режимах чтения/записи. – ylabidi
да, конечно, потому что поток два сначала получил блокировку и обработал данные, поэтому после разблокировки по потоку 2 и фиксации по потоку 1 он имеет модифицированные данные по потоку 2. –