日期:2014-05-20  浏览次数:20665 次

线程同步的问题求解

import java.util.ArrayList;
import java.util.List;

public class TestThread {

public static void main(String[] args) {
List list = new ArrayList();
list.add(10000);

for(int i = 0; i < 10; i++) {
new Thread(new SubThread(list)).start();
}

System.out.println(list.get(0));
}
}

class SubThread implements Runnable {
private List list;

public SubThread(List list) {
this.list = list;
}

public void run()  {
for(int i = 0; i < 1000; i++) {
synchronized (list) {
this.list.set(0, (int)this.list.get(0)-1 );
}
}
}
}


代码很简单,只是想问下,为什么结果不为零?该如何改?

------解决方案--------------------
多线程,自然就是异步执行的了,你启动了10个子线程,但主线程依然会往下执行,所以你10个子线程还没执行完,主线程已经执行到 System.out.println(list.get(0));了。自然打印出来的就不是0了。
如果非要打印出0,那就给每个子线程取个名字,然后调用,线程的join方法,等待线程结束,不过你这里也失去了使用多线程的意义了。
------解决方案--------------------
你延时几秒再打印,就是0了