synchronized里置状态为什么不能锁住
synchronized里放状态为什么不能锁住。
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对象,按理说不也应该能保证线程安全么。
------解决思路----------------------
可以看Integer的部分源码
Integer里面唯一属性value是final的,也就是初始化完之后是不允许改变的
换句话说,若改变了也就会生成新的对象了
所以值改变了,就跟之前不是同一对象了
所以锁就失去作用了
类似 基本类型的封装类 以及String都是如此
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对象,按理说不也应该能保证线程安全么。
------解决思路----------------------
可以看Integer的部分源码
private final int value;
Integer里面唯一属性value是final的,也就是初始化完之后是不允许改变的
换句话说,若改变了也就会生成新的对象了
所以值改变了,就跟之前不是同一对象了
所以锁就失去作用了
类似 基本类型的封装类 以及String都是如此