以下这段代码不是线程安全的
Integer i
=
0
;
......
synchronized (i) {
i ++ ;
}
......
......
synchronized (i) {
i ++ ;
}
......
原因是Java的自动封箱和解箱操作在作怪。
这里的i++实际上是i = new Integer(i+1),所以执行完i++后,i已经不是原来的对象了,同步块自然就无效了。
其它基本类型的封装类,如Short、Long等等也不能作为同步对象。