今天看synchronized同步的时候用到了Integer来进行测试,发现结果始终不对劲,后来查了之后发现synchronized不能用来同步Integer等封装类的。类似下面这种写法,不是线程安全:
Interger i = 0;
new Thread(){
synchronized(i){
for(int i=0; i<100; i++){
i++;
Thread.sleep(10);
}
}
}.start;
new Thread(){
synchronized(i){
for(int i=0; i<100; i++){
i++;
Thread.sleep(10);
}
}
}.start;
这里的i++
相当于i = new Integer(i+1)
,i++之后的对象已经不是之前的i了,自然synchronized也就没有用了。