Синхронизированный Arraylist между двумя потоками не возвращает одно и то же значение

С bash Добавьте запятую в конец значения, удалите каждую не запятую и получите длину.

cnt="${value//[^,]/},";echo "${#cnt}"
1
задан Seyed Vahid Hashemi 18 January 2019 в 20:28
поделиться

2 ответа

Вы получаете

end: 1065878
end: 2000000

Первая строка - из потока, который первым завершил свою работу. Это не должно быть точно 1M, потому что несколько потоков работают. Разумно предположить, что к тому моменту, когда один первый поток завершит добавление своего 1M, другой добавил хотя бы один.

Вторая строка всегда 2M (как вы и ожидали) из-за синхронизированного метода.

Полагаю, первый поток должен исполниться с тем числом, которое я хотел, не больше, не меньше.

Все происходило параллельно. Нити были запущены. Каждый пытался вызвать updateList: один вошел, остальные ждали. Не было приоритета относительно того, кто должен быть следующим, поэтому контроль над методом передавался среди всех работников довольно случайным образом.

Бьюсь об заклад, вы все еще думаете о последовательном выполнении :) Один поток запускает весь метод run, печатает 1M, другой берет список размером 1М и добавляет свою часть.

Чтобы лучше это понять, добавьте оператор print

private void updateList(int i) {
    synchronized (myList) {
        myList.add(i);
        System.out.println(Thread.currentThread().getName() + " added " + i);
    }
}

и уменьшите количество элементов, добавляемых к задаче, скажем, в 10.

pool-1-thread-1 added 0
pool-1-thread-1 added 1
pool-1-thread-1 added 2
pool-1-thread-1 added 3
pool-1-thread-2 added 0
pool-1-thread-2 added 1
pool-1-thread-2 added 2
pool-1-thread-2 added 3
pool-1-thread-1 added 4
pool-1-thread-1 added 5
pool-1-thread-1 added 6
pool-1-thread-1 added 7
pool-1-thread-1 added 8
pool-1-thread-1 added 9
end: 14
pool-1-thread-2 added 4
pool-1-thread-2 added 5
pool-1-thread-2 added 6
pool-1-thread-2 added 7
pool-1-thread-2 added 8
pool-1-thread-2 added 9
end: 20
0
ответ дан Andrew Tobilko 18 January 2019 в 20:28
поделиться

вывод должен быть: 2000000

Нет, по трем причинам:

  1. Вы печатаете две вещи, поэтому вывод не будет одно число.
  2. Он печатает размер, когда каждая нить добавила 1000000 вещей; вы ничего не знаете о том, сколько другой поток сделал на этом этапе.
  3. Вы не получаете доступ к размеру синхронизированным образом, поэтому вы обязаны получить не актуальное значение.
0
ответ дан Andy Turner 18 January 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: