一個簡單的計數器,本來以為不需要同步保護,後來發現不行,還是得加上。程序:
public class TestMain {
int i = 0; //計數器初始值為0
public static void main(String[] args) {
TestMain c = new TestMain();
Worker x = new Worker(c);
for (int i=0; i<200; i++) { //200個線程
new Thread(x).start();
}
while (true) { //每隔一秒中輸出計數器的值
System.out.println(c.i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
class Worker implements Runnable {
TestMain c;
public Worker(TestMain c) {
this.c = c;
}
public void run() {
try {
Thread.sleep((int)(Math.random() * 25)); //隨機Sleep一段時間
} catch (InterruptedException e) {
}
c.i++; //計數器自增 問題在這裡 並發寫入
}
}
上面的程序50%的幾率結果是200,其余的是199,198....
c.i++一句需要並發保護。
本來我以為Java裡面++是原子的呢,呵呵。
解決方法,加上同步控制,或者使用JDK5裡面新增加的AtomicInteger類。