Странная многопоточка

Учу многопоточность, и в уроке по примеру переписал кусок кода(первый поток должен инкрементировать значение на 1, второй поток наоборот декрементировать). Но он выполняется последовательно, как будто стоит метод join. Так как же добиться того результата что в уроке?

Класс нашего значения

введите сюда описание изображения

введите сюда описание изображения

В итоге получается

введите сюда описание изображения

Вот такой результат получился в уроке

введите сюда описание изображения


Ответы (1 шт):

Автор решения: KoVadim

Добавьте внутрь кода немного sleep'ов (Thread.sleep(500);, думаю даже 100-200 мс будет предостаточно) и есть шанс, что вывод сильно поменяется.

Ваш цикл такой маленький, что выполняется быстрее, чем запускается новый поток. То есть, поток декримента быстренько в ноль все выводит и завершает свою работу. Потом запускается поток инкрементирования и увеличивает все до 10 и тоже завершается. Но это один вариант развития событий. Возможен и другой - первый поток отправляется на запуск, но система решила переключить контекст и дала кому то другому время, потом снова переключила на основной поток и произошел запуск второго потока. Управлять тем, когда система сделает переключение, можно, но нужно ли? кстати, sleep обычно и говорит системе - я тут посплю, отдай мое время другим:)

В целом, отладка такой гонки - ещё то развлечение. Посмотрите на сам цикл - вначале вызывается getCounter, потом он изменяется и снова вызывается getCounter. Обычный программист ожидает, что эти два вызова будут отличаться на +1 или -1. Но это не так. Система может поставить поток на паузу практически в любой момент времени (ну не почти, но там это не столь важно). И может получиться так, что один поток взял счетчик, сверил условие и тут его поставили на паузу. Теперь взялся другой поток работать и отмотал 4-5 циклов. И теперь когда первый снова придет работать, то изменять (делать инкремент/декримент) он будет совершенно другое число (собственно, в Вашем выводе это и наблюдается). Этому коду явно нужно немного мютексов или атомиков.

Как у авторов кода получилось так красиво? скорее всего они просто подогнали код. Или запускали много-много раз, что бы все сошлось. Или просто чего то недоговаривают.

А где код? извините, но Вы привели код картинками. А набивать его немного накладно.

→ Ссылка