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 значительно доработан.
А сначала, элементарные вещи лучше наверное у Эккеля почитать или Шилдта (но мне лично стиль Шилдта не нравится)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽