Оба потока могут скопировать значение static IntCell n
в локальное хранилище потока.
Используйте ключевое слово volatile
, чтобы сигнализировать потокам о синхронизации локального значения потока и общего значения.
static volatile IntCell n
Другая проблема - сбой атомарности, критическая область:
// Thread 1 // Thread 2
temp = n.getN();
temp = n.getN();
n.setN(temp + 1);
n.setN(temp + 1);
С общим n
это увеличит n не на 2, а всего на 1.
synchronize (n) {
temp = n.getN();
n.setN(temp + 1);
}
Это обеспечивает блокировку критической области на семафоре, связанном с n
.