Ваш synchronized
блок в FunnyStringGenerator.next()
работает нормально.Он будет возвращать '+'
и '-'
поочередно.
Однако у вас есть условие гонки в ThreadToGenerateStr.run()
:
System.out.print(gen.next());
Это эквивалентно:
char c = gen.next(); // Synchronized
System.out.print(c); // Not synchronized
Проблема возникает, когда:
- Поток 1 вызывает gen.next (), получая результат '-'
- Поток 2 вызывает gen.next (), получая результатиз '+'
- Поток 2 вызывает System.out.print (), запись '+'
- Поток 1 вызывает System.out.print (), запись '-'
В результате '+' и '-' записываются в противоположном порядке.
Существуют различные возможные обходные пути, например:
- Вызовите оба поколения.next () и System.out.print () в одном блоке
synchronized
(как в ответе собачьей упущенности) - Заставьте gen.next () записать символ в поток вместо его возврата
- Сделайте, чтобы gen.next () добавлял символ к общему BlockingQueue и имел выделенный поток ввода-вывода, берущий символы из этой очереди и печатавший их.