关于synchronized和Integer自增的小问题

2019-05-08

 

public class IntegerSysnTest implements Runnable{ 
public static Integer i=0; 
static IntegerSysnTest tyrell=new IntegerSysnTest(); 
 @Override 
 public void run(){ for(int j=0;j<10000;j++){ 
    synchronized (i){ i++; } } 
 } 
 public static void main(String[] args) throws InterruptedException{ 
 Thread t1=new Thread(tyrell); 
 Thread t2=new Thread(tyrell); 
 t1.start();t2.start();
 t1.join();t2.join(); 
 System.out.println(i); }
}

这次执行结果是 `14713 `.So,why?

因为 i++实质是 创建一个新的 Integer对象,并将它的引用赋值给i。此时的```Integer i=0;i++;```

实际上是```Integer i=0;i=Interger.valueOf(i.inValue()+1);```

        所以,多个线程间看到的不一定是 同一个 i 对象,i对象一直在变,也就是说 两个线程每次加锁都加在了不同的对象实例上,从而导致对临界区代码的控制出现问题。