关于synchronized无法锁住Integer原因
原因
在多线程的时候,为了保证数据安全,必须在修改数据时使用线程同步,java中的synchronized
用来实现线程同步、线程列队。
学完多线程基础的我,写一个多线程交替输出1,2,3,4,5...
,一个线程负责输出偶数,一个线程负责输出奇数,由于这个数是整数,在java中int
又是基本数据类型,基本数据类型并不是共享的,也就是基础数据类型是在栈中申明,java提供了一个Integer
包装类,使用的时候发现根本锁不住这个对象。
回忆之前对Integer
的知识:为了提高程序效率,Integer
在类加载时就已经创建了-128到127
的对象
嗯!!!!如果我对这个对象进行运算的话!内存地址是不是也不一样?(细思极恐)
System.out.println(num++;)
粗暴解决方案
建一个加锁类(人工造锁),将需要用到的运算什么的加进去,嗯简单粗暴!!!!
class IntegerLock {
private Integer num = 0;
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public Integer remainder(Integer o) {
return num % o;
}
public void plus(Integer o) {
num = num + o;
}
@Override
public String toString() {
return num.toString();
}
}