AlexeyChizhov
@AlexeyChizhov

Java. Потоки. Делаю задание по книжке и вывод каждый раз разный, хотя должен быть одинаковый. Почему ?

Друзья, подскажите новичку.
Делаю задание по книжке и вывод каждый раз разный, хотя должен быть один и тот же 98098,98099. Почему так и что почитать про это ?

ed335ac66a374ab7926e2e4a2dc2208f.png
  • Вопрос задан
  • 2232 просмотра
Решения вопроса 1
AlexeyChizhov
@AlexeyChizhov Автор вопроса
Большое спасибо всем за ответы. Проблема оказывается в том что инкрементирование (counter += add;) это не атомарная операция . Я этого не знал. Отсюда и каждый раз разные и неправильные значения на выходе. Происходит примерно так:

Т1: Поток 1 считывает i из памяти, она равна 1.
Т2: Поток 1 инкрементит до 2 у себя в регистре.
Т3: Происходит context switch, поток 1 саспендится, содержимое его регистров сбрасывается во временное хранилище, а в процессор записывается содержимое регистров для потока 2, и этот поток начинает работать.
Т4: Поток 2 считывает i из памяти, она равна 1.
Т5: Поток 2 инкрементит до 2 у себя в регистре.
Т6: Поток записывает в память 2.
Т7: Опять context switch, начинает работать первый поток.
T8: Поток 1 записывает в память 2.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@onepavel
Консультация и разработка мобильных приложений
У вас два потока используют один объект. Между потоками нет никакой синхронизации в действиях.
Поэтому ответы будут разные.
Что значит что почитать ? У нас есть хабр, в поиске наберите "java потоки" выбирайте статьи по своему уровню и читайте =) А вообще Шилдт хорош.
Ответ написан
Комментировать
@j_wayne
Когда-то читал вот такую книгу: www.amazon.com/Java-Concurrency-Practice-Brian-Goe...
Основы не изменились, но concurrency в Java 7 значительно доработан.
А сначала, элементарные вещи лучше наверное у Эккеля почитать или Шилдта (но мне лично стиль Шилдта не нравится)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы