С bash Добавьте запятую в конец значения, удалите каждую не запятую и получите длину.
cnt="${value//[^,]/},";echo "${#cnt}"
Вы получаете
end: 1065878
end: 2000000
Первая строка - из потока, который первым завершил свою работу. Это не должно быть точно 1M
, потому что несколько потоков работают. Разумно предположить, что к тому моменту, когда один первый поток завершит добавление своего 1M
, другой добавил хотя бы один.
Вторая строка всегда 2M
(как вы и ожидали) из-за синхронизированного метода.
Полагаю, первый поток должен исполниться с тем числом, которое я хотел, не больше, не меньше.
blockquote>Все происходило параллельно. Нити были запущены. Каждый пытался вызвать
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
вывод должен быть: 2000000
blockquote>Нет, по трем причинам:
- Вы печатаете две вещи, поэтому вывод не будет одно число.
- Он печатает размер, когда каждая нить добавила 1000000 вещей; вы ничего не знаете о том, сколько другой поток сделал на этом этапе.
- Вы не получаете доступ к размеру синхронизированным образом, поэтому вы обязаны получить не актуальное значение.