我刚刚在 Java 中遇到了同步块,并编写了一个小程序来测试它是如何工作的。
我创建了 10 个线程,并让每个线程将一个 Integer 对象递增 1000 次。
因此,对于同步,我会假设所有线程完成工作后的结果为 10000,而没有同步的结果小于 10000。
但是,同步并不像我预期的那样工作。
我想这与对象的不变性有关。
我的程序:
public class SyncTest extends Thread{
private static Integer syncObj = new Integer(0);
private static SyncTest[] threads = new SyncTest[10];
private boolean done = false;
public void run(){
for(int i = 0; i < 1000; i++){
synchronized(syncObj){
syncObj ++;
}
}
done = true;
}
public static void main(String[] args) {
for(int i=0; i < threads.length; i++){
threads[i] = new SyncTest();
threads[i].start();
}
while(!allDone()); //wait until all threads finished
System.out.println(syncObj);
}
private static boolean allDone(){
boolean done = true;
for(int i = 0; i < threads.length; i++){
done &= threads[i].done;
}
return done;
}
}
有人可以澄清一下吗?