| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Количество повторений потоков |
| Автор: Pawl 19.2.2013, 09:46 | ||||||||
| Доброго времени суток. Создал такое приложеньице
где цикл в методе run класса RunnerInc повторяется, пока value в классе CheesyCounter не станет равно 1500. Т. е. count в run должен стать в итоге равным 1500. Так и получается, если в Main запустить один поток. Но если потоков несколько, вывод может быть, к примеру, таким:
т. е. суммарный count всех потоков равен 1501. Я так понимаю, что дело тут в операторе count++, но как его переписать нужным образом, не знаю. Был бы благодарен, если просветите. Спасибо! |
| Автор: jk1 19.2.2013, 16:26 | ||
| Проблема в том, что тут должна быть атомарной операция "проверить, что счетчик меньше и увеличить его". Вы же сделали атомарной только операцию увеличения счетчика. В итоге имеем такую последовательность: ... 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'ом:
|
| Автор: jk1 19.2.2013, 17:43 | ||||
Чтобы получился пример можно исправить и исходный вариант:
|
| Автор: Pawl 19.2.2013, 19:13 |
Действительно, про синхронизацию в run я как-то не подумал! |
| Автор: Viroman 27.2.2013, 17:20 | ||||||
Тема уже неактуальна, но это решение
Приведёт к тому, что лишь один поток будет накручивать счётчик, который первым зашел в синхронизированный блок. Это ли то, что хотелось достичь, вот в чём вопрос.. Другие возможные решения..
либо вовсе заблокировать и чтение и запись на одном атомарном доступе.
|
| Автор: jk1 27.2.2013, 17:25 | ||||
Viroman, а проверить?) Модифицируем немного решение и видим ID разных потоков, которые накручивают счетчик:
|