对象锁的变化
???????? ?synchronized 关键字锁定对象。对象是在 synchronized 代码内部被锁定的,这一点对此对象以及您对其对象引用所作的更改意味着什么呢?对一个对象作同步处理只锁定该对象。但是,必须注意不要重新分配被锁定对象的对象引用。那么如果这样做会发生什么情况呢?请考虑下面这段代码,它实现了一个 Stack:
??????
class Stack { //与前面相同... public synchronized void push(int val) { //如果为空,则重新分配整数数组(即我们的 Stack)。 if (index == intArr.length) { stackSize *= 2; int[] newintArr = new int[stackSize]; System.arraycopy(intArr, 0, newintArr, 0, intArr.length); intArr = newintArr; } intArr[index]= val; index++; } public synchronized int pop() { int retval; if (index > 0) { retval = intArr[index-1]; index--; return retval; } throw new EmptyStackException(); } }?
?
?
???????这个修改更改了实际上获取的锁。获取的锁是针对为其调用方法的对象的,而不是锁定 intArr 变量所引用的对象。因为获取的锁不再针对 intArr 所引用的对象,所以允许代码重新指定 intArr 对象引用。
?
?
?
?
??????