![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Pawl |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Доброго времени суток.
Создал такое приложеньице
где цикл в методе run класса RunnerInc повторяется, пока value в классе CheesyCounter не станет равно 1500. Т. е. count в run должен стать в итоге равным 1500. Так и получается, если в Main запустить один поток. Но если потоков несколько, вывод может быть, к примеру, таким:
т. е. суммарный count всех потоков равен 1501. Я так понимаю, что дело тут в операторе count++, но как его переписать нужным образом, не знаю. Был бы благодарен, если просветите. Спасибо! -------------------- В действительности всё совсем не так, как на самом деле |
||||||||
|
|||||||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Проблема в том, что тут должна быть атомарной операция "проверить, что счетчик меньше и увеличить его".
Вы же сделали атомарной только операцию увеличения счетчика. В итоге имеем такую последовательность: ... value = 1499 1. Thread 1 проверяет, что 1499 < 1500 2. Thread 2 проверяет, что 1499 < 1500 3. Thread 1 входит в synchronized-блок, увеличивает value на единицу и выходит 3. Thread 2 входит в synchronized-блок, увеличивает value на единицу и выходит итого value = 1501 В качестве решения предлагаю выкинуть CheesyCounter и воспользоваться стандартным CAS'ом:
-------------------- Opinions are like assholes — everybody has one |
|||
|
||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Спасибо за стандартное решение, просто хотелось сделать простенькие примерчики работы потоков с общим классом. -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Чтобы получился пример можно исправить и исходный вариант:
-------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Действительно, про синхронизацию в run я как-то не подумал! -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
Viroman |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Тема уже неактуальна, но это решение
Приведёт к тому, что лишь один поток будет накручивать счётчик, который первым зашел в синхронизированный блок. Это ли то, что хотелось достичь, вот в чём вопрос.. Другие возможные решения..
либо вовсе заблокировать и чтение и запись на одном атомарном доступе.
|
||||||
|
|||||||
jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Viroman, а проверить?) Модифицируем немного решение и видим ID разных потоков, которые накручивают счетчик:
-------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |