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。但我認爲synchronized關鍵字應該獲得對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。 –