Я считаю, что работает нормально.Проблема в том, что операторы print, call to print, объединение строк в System.out.println(Thread.currentThread().getName() + " " +i + " is " + cup.getColor());
и т. Д. Не синхронизируются.
Я добавил операторы print в ваши методы получения / установки для записи времени вызовов: -
public String getColor() {
System.out.println("-------------------------get " + Thread.currentThread().getName() + this.color + " " + System.nanoTime());
return color;
}
public void setColor(String color) {
System.out.println("-------------------------set " + Thread.currentThread().getName() + color + this.color + " " + System.nanoTime());
this.color = color;
}
Фрагмент напечатанного текста: -
.
.
.
Thread-0 4 is red
-------------------------get Thread-1red 1356826035808750
Thread-1 8 is red
-------------------------get Thread-2red 1356826035425706
Thread-2 2 is red
-------------------------get Thread-1red 1356826035963697
Thread-1 9 is red
-------------------------get Thread-0red 1356826035894581
-------------------------set Thread-1blackred 1356826036165653
-------------------------get Thread-2red 1356826036036858
Thread-2 3 is black
-------------------------get Thread-1black 1356826036219728
Thread-1 0 is black
Thread-0 5 is red
-------------------------get Thread-1black 1356826036402925
Thread-1 1 is black
-------------------------get Thread-2black 1356826036305139
Thread-2 4 is black
-------------------------get Thread-1black 1356826036535236
Thread-1 2 is black
.
.
.
Проблема, которая вас беспокоит, заключается в следующей строке: - Thread-0 5 is red
Она должна была печатать black
, верно?
Ну, этот поток вошел в получатель прежде, чем другой поток изменил значение.Это видно из этих строк: -
-------------------------get Thread-0red 1356826035894581
-------------------------set Thread-1blackred 1356826036165653
Таким образом, оно правильно прочитало значение, но обработка, выполненная после этого, заняла много времени по сравнению с временем, потраченным другими потоками на выполнение того, что они делали.
Рад, что кто-то поправил меня, если я ошибаюсь.:)