synchronized增加一个int值

时间:2014-07-31 09:24:09

标签: java multithreading

为什么这个程序在每次执行时都不会显示2000?我知道我可以使用AtomicInteger,但我很好奇。

class Increment extends Thread{
     static Integer i=new Integer(0);

    public void run(){

        for(int j=1;j<=1000;j++){
            synchronized (i) {
                i++;
            }
        }

    }
}


public class Puzzle {
    public static void main(String args[]) {    
        Thread t1=new Increment();
        Thread t2=new Increment();
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        }catch (InterruptedException r){}
        System.out.println(Increment.i);    
    }    
}

1 个答案:

答案 0 :(得分:10)

您在可变变量i上进行同步。此变量每次都会更改其值,因此每次获取另一个对象的锁定时。因此,每个线程都获得一个非竞争锁,并且可以同时进行,就像没有同步一样。

课程:使用专用的private static final Object lock = new Object()作为锁定。