“不要对locked object(上锁对象)的object reference 重新赋值”
怎么理解这句话呢?假如我locked object正是我需要修改的对象呢?
这里所说的并不是不可以修改object, 而是不能修改这个object的reference,因为一旦修改reference改变了,这个对象的存放地址就改变了,其实就变成了另外一个对象了只是引用的变量名不同而已,所以原来获得的锁在同一时刻就有可能发生改变,因此有可能发生不同步。
class Stack{
private int stackSize = 10;
private int[] intArr = new int[stackSize];
private int index;
public void push(intArr){
synchronized(intArr){
if (index == intArr.length){
stackSize * =2;
int[] newintArr = new int[stackSize];
System.arraycopy(intArr,0,newintArr,0,intArr.length);
intArr[index] = val; //当改变这个时,lock发生变化, pop可能便会进运行。
index++;
}
}
}
public int pop(){
synchronized(intArr){
// do some operator;
}
}
讲上面改成synchronized instance 函数或同步另一个对象就行了。