原因是Java的自动封箱和解箱操作在作怪。这里的i++实际上是i = new Integer(i+1),所以执行完i++后,i已经不是原来的对象了,同步块自然就无效了
Long 类型同理,String是因为String定义的变量会放在常量池中,如果多个线程定义的String变量的值相等,则锁无效
String的值一致时指向的地址是一致的,其实两个线程锁的是同一个对象。而在实际工作中,String值相同的情况时有发生,而出现问题有不容易发现。
原因是Java的自动封箱和解箱操作在作怪。这里的i++实际上是i = new Integer(i+1),所以执行完i++后,i已经不是原来的对象了,同步块自然就无效了
Long 类型同理,String是因为String定义的变量会放在常量池中,如果多个线程定义的String变量的值相等,则锁无效
String的值一致时指向的地址是一致的,其实两个线程锁的是同一个对象。而在实际工作中,String值相同的情况时有发生,而出现问题有不容易发现。