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

java的一问?
import java.util.*;
public class NameList {
private List names=new ArrayList();
public synchronized void add(String name){
names.add(name);
}
public synchronized void printAll(){
for(int i=0;i<names.size();i++){
System.out.print(names.get(i)+" ");
}
}
public static void main(String[] args){
final NameList s=new NameList();
for(int i=0;i<2;i++){
new Thread(){
public void run(){
s.add("A");
s.add("B");
s.add("C");
s.printAll();
}
}.start();
}
}

}
输出的结果第一种情况:A B C A B C A B C 
输出的结果第二种情况:A B C A A B C A B C
第一个结果我懂,但是这第二种结果是怎么冒出来的啊?不明白!求解

------解决方案--------------------
你将方法 设置为了同步,进行了加锁,理论上应该不会出现第2种情况吧,我试了很多次 都只得能得到第一种情况。
我觉得出现第二种情况的原因是:在第一个线程加进A B C 后,还没有打印,cpu被第2个线程抢走,线程2加入一个 A ,又线程1抢回去,打印出 A B C A,然后线程2继续加入 B C,然后打印出 A B C A B C,所以最后结果为 A B C A A B C A B C 。如果这样想的话 ,感觉那个同步就没起到应有的作用了。(求讨论)
------解决方案--------------------
探讨

你将方法 设置为了同步,进行了加锁,理论上应该不会出现第2种情况吧,我试了很多次 都只得能得到第一种情况。
我觉得出现第二种情况的原因是:在第一个线程加进A B C 后,还没有打印,cpu被第2个线程抢走,线程2加入一个 A ,又线程1抢回去,打印出 A B C A,然后线程2继续加入 B C,然后打印出 A B C A B C,所以最后结果为 A B C A A B C A ……

------解决方案--------------------
探讨

你将方法 设置为了同步,进行了加锁,理论上应该不会出现第2种情况吧,我试了很多次 都只得能得到第一种情况。
我觉得出现第二种情况的原因是:在第一个线程加进A B C 后,还没有打印,cpu被第2个线程抢走,线程2加入一个 A ,又线程1抢回去,打印出 A B C A,然后线程2继续加入 B C,然后打印出 A B C A B C,所以最后结果为 A B C A A B C A ……