synchronized里放状态为什么不能锁住。

J2EE 码拜 10年前 (2015-04-02) 1151次浏览 0个评论

public class MyObj {
private Integer sum = 10;

public  void  add(int num) {

synchronized(sum){
sum = sum + num;
System.out.println(Thread.currentThread().getName() + “\tsum=” + sum);
}

}
}
我知道synchronized锁this会锁住this对象,保证线程安全;那么为什么锁sum就不行呢,锁住sum对象,按理说不也应该能保证线程安全么。

synchronized里放状态为什么不能锁住。
40分
可以看Integer的部分源码

private final int value;

Integer里面唯一属性value是final的,也就是初始化完之后是不允许改变的
换句话说,若改变了也就会生成新的对象了
所以值改变了,就跟之前不是同一对象了
所以锁就失去作用了
类似 基本类型的封装类 以及String都是如此


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明synchronized里放状态为什么不能锁住。
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!