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对象一直在变,也就是说 两个线程每次加锁都加在了不同的对象实例上,从而导致对临界区代码的控制出现问题。