不要对locked object(上锁对象)的object reference 重新赋值

“不要对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 函数或同步另一个对象就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值