Integer类型:
i++实际上是i = new Integer(i+1),所以执行完i++后,i已经不是原来的对象了,锁的对象发生了改变,多个线程锁的对象各不相同,同步块自然就无效了。
Long 类型:同上
String类型:
是因为String定义的变量会放在常量池中,如果多个线程定义的String变量的值相等,则锁无效,他们看起来锁的是不同对象,其实是同一个对象。这种很难发现
Integer类型:
i++实际上是i = new Integer(i+1),所以执行完i++后,i已经不是原来的对象了,锁的对象发生了改变,多个线程锁的对象各不相同,同步块自然就无效了。
Long 类型:同上
String类型:
是因为String定义的变量会放在常量池中,如果多个线程定义的String变量的值相等,则锁无效,他们看起来锁的是不同对象,其实是同一个对象。这种很难发现