synchronized增加一个int值

luc*_*uta 2 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);    
    }    
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 10

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

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

  • "使用专用的最终对象"不应该读取"使用专用的最终静态对象"吗?特别是在这种情况下. (2认同)
  • 必须强调的是,它必须始终是*同一个对象*.您可以将相同的引用存储在不同的非"静态"变量中(尽管它没有多大意义).你也可以使用`synchronized(Increment.class)`而不需要额外的变量. (2认同)