package threadShareResource1;
public class NonSynchro1 {
private int sum = 0;
public static void main(String[] args) {
NonSynchro1 n = new NonSynchro1();
n.task();
System.out.println(n.getSum());
}
public synchronized void sumAddOne(){
sum++;
}
public void task(){
for (int i = 0; i < 100; i++) {
new Thread(new Runnable(){
@Override
public void run() {
sumAddOne();
}
}).start();
/* try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
} */
}
}
public int getSum() {
return sum;
}
}
Без прокомментированной части кода программа имеет повреждение данных, которое не является 100 при каждом запуске. Но я думал, что синхронизированное ключевое слово должно получить блокировку метода sumAddOne, который является критическим регионом моей программы, позволяя каждому потоку обращаться к этому методу каждый раз.Синхронизированное ключевое слово не работает
Я также пытаюсь использовать ExecutorService, но он не дает 100 всех прогонов.
public void task(){
ExecutorService s = Executors.newCachedThreadPool();
for (int i = 0; i < 100; i++) {
s.execute(new Thread(new Runnable(){
@Override
public void run() {
sumAddOne();
}
}));
}
s.shutdown();
while(!s.isTerminated()){}
}
Каково ожидаемое поведение? Чего вы пытаетесь достичь? –
Чтобы проверить, когда 100 потоков обращаются к общей переменной, используя синхронизацию. Результат должен быть 100 во всех прогонах. –