问一下各位师兄师姐:为什么我在getCount()前面加上synchronized或者不加,得到的输出结果顺序都是正确的,以我对线程的理解,如果不加synchronized得到的结果顺序应该是有点混乱的?可是并没有出现.这是为什么?高手指点一下!class AddCount{
int count=0;
public  synchronized  int getCount(){
return count++;
}
}public class TestCountThread{
AddCount ac=new AddCount();
    public static void main(String[] args){
     TestCountThread tct=new TestCountThread();
     for(int i=1;i<10;i++){
     tct.new CountThread().start();
     tct.new CountThread().start();
     tct.new CountThread().start();
     tct.new CountThread().start();
     }
    }
    class CountThread extends Thread{
     public void run(){
     System.out.println(ac.getCount());
     }
    }
}

解决方案 »

  1.   

    你看到的只是count
    无论哪个线程先运行count都是++
    所以你看不出区别来
    你看看线程就知道了
      

  2.   

    你不如改成 System.out.println(“before”);count = count + 1; System.out.println("after");
    说不定可以看出不同。
    count++可能不足够不拆分吧。
      

  3.   

    几次的情况说明不了问题,我同样的多线程的机器,在迅驰的本上就好好的不出事情,在我家里AMD的双核的机器上就不行。
    这种东西被影响的外界条件太多了。你要试验很多很多次,加大循环次数,就会看到异常情况的发生了。
      

  4.   

    像楼主这样code加不加synchronized确实都可能是乱的(测试第三次出现混乱结果)public synchronized int getCount() {
        System.out.println(count++);
        return count;
    }试试这样吧 多试几次就知道了
      

  5.   

    你的程序无论怎样都不会乱续,因为永远只对一个count做++,无论哪个线程都做一样的工作,打印结果必然不会乱。而且,+=这样的操作是原子操作,不存在同步问题。因此不用加关键字synchronized。可以这么写一个来观察:
    public class Test
    {
    public static void main(String s[])
    {
    MyThread mt1 = new MyThread(1);
    MyThread mt2 = new MyThread(2);
    MyThread mt3 = new MyThread(3);
    mt1.start();
    mt2.start();
    mt3.start();
    }
    }class MyThread extends Thread
    {
    int id = 0; int count = 0; public MyThread(int id)
    {
    this.id = id;
    } public void run()
    {
    while (true)
    {
    System.out.println("Thread " + id + "  " + count++);
    }
    }
    }
    通过观察结果可以知道3个线程并不是平均获得CPU时间的。
    一段结果:
    Thread 1  34374
    Thread 1  34375
    Thread 3  35065
    Thread 2  23190
    Thread 1  34376
    Thread 3  35066
    Thread 2  23191
    Thread 1  34377
    Thread 3  35067
    Thread 2  23192
    Thread 1  34378
      

  6.   

    到底是这么回事啊?怎么dracularking 和 anod两位师兄说的完全相反的啊?一个说会乱序,一个说不会,我该信谁的啊?哪位高手能否用简单的回答说明一下!
      

  7.   

    不加synchronized
    把你的System.out.println(ac.getCount())改成
    System.out.println(Thread.currentThread().getName()+":"+ac.getCount());
    得到结果
    Thread-0:0
    Thread-1:1
    Thread-4:3
    Thread-3:2
    Thread-5:4
    Thread-7:6
    Thread-2:5
    Thread-9:7
    Thread-11:8
    Thread-13:9
    Thread-6:10
    加上后得到
    Thread-1:0
    Thread-0:1
    Thread-3:2
    Thread-5:3
    Thread-7:4
    Thread-9:5
    Thread-2:6
    Thread-11:7
    Thread-6:8
    Thread-13:9
    Thread-8:10