Здравствуйте, eao197, Вы писали:
E>В итоге
E>Очередное повторение на собственной шкуре банальных истин:
E>* программировать нужно сначала на бумаге, а не лихим кавалерийским наскоком;
E>* ошибки при проектировании самые тяжелые;
E>* неправильно написанная многопоточная программа может вести себя совершенно непредсказуемым образом;
E>* к проверке правильности работы программы нужно подходить, как минимум, не менее тчательно, чем к ее написанию.
Первый вывод, который нужно было сделать: писать нормальное ТЗ и представлять алгоритм без потери существенной информации из условия. Сразу бросилось в глаза, как ты описываешь логику работы хамелеонов
Первый хамелеон приходит на место встречи, видит, что swappedColor_ равен null, понимает, что он первый. В swappedColor_ помещается указатель на локальную переменную с собственным цветом. И засыпает.
Приходит второй хамелеон, видит, что swappedColor_ не равен null, считывает из нее цвет первого, записывает свой цвет, пинает первого и уходит.
Первый просыпается, обнуляет swappedColor_, берет из своей локальной переменной цвет второго и уходит, освобождая площадку.
Задание было изначально неточно переведено в формальное ТЗ, а затем и в алгоритм, естественно, после этого хоть ты десять раз правильно спроектируй систему, всё равно ошибка может спокойно возникнуть.