Я изучал документацию Oracle по синхронизации, и там был счетчик классов:
class Counter {
int c = 0;
public void increment() {
c++;
}
public void decrement() {
c--;
}
public int value() {
return c;
}
}
И они немного объясняют некоторые возможные неправильные чередования с двумя потоками, я пытался написать программу для тестированияэти неправильные чередования:
public class TestPara {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
AdderCounter ac = new AdderCounter(counter);
SubberCounter sc = new SubberCounter(counter);
Thread t1 = new Thread(ac);
Thread t2 = new Thread(sc);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(counter.c);
}
}
class AdderCounter implements Runnable{
Counter counter;
public AdderCounter(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
counter.increment();
System.out.println(counter.value());
}
}
class SubberCounter implements Runnable{
Counter counter;
public SubberCounter(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
counter.decrement();
System.out.println(counter.value());
}
}
Но независимо от того, синхронизирован ли доступ к c или нет, я всегда получаю значения 0, 0 и 0, и я не знаю почему.
Кто-нибудь может мне помочь?С наилучшими пожеланиями.