当然是变reference,对象都已经告诉你是immutable的了,你还变什么变?只是前面的争论在于immutable对象有没有可能在这种方式下使用而已。我认为会有,geekcode认为不会有。这个就不用争辩了,用法不同,不用也无所谓。
举一个例子,比如讲Java自己对于incrementAndGet方法的实现
public final int incrementAndGet() {
for (;;) { // 这里就是乐观锁的表现。它假设自己应该是能够成功的,所以不怕这个for
int current = get(); //这里,你可以把current就定义成final,那就是immutable对象。
int next = current + 1; //这里,如果把next定义为final,那就是一个新建的immutable对象
if (compareAndSet(current, next)) //此处加锁,改reference
return current;
}
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); //原子操作,你改reference是一定要加这个锁的。不加锁是绝对不可能实现的。
}
举一个例子,比如讲Java自己对于incrementAndGet方法的实现
public final int incrementAndGet() {
for (;;) { // 这里就是乐观锁的表现。它假设自己应该是能够成功的,所以不怕这个for
int current = get(); //这里,你可以把current就定义成final,那就是immutable对象。
int next = current + 1; //这里,如果把next定义为final,那就是一个新建的immutable对象
if (compareAndSet(current, next)) //此处加锁,改reference
return current;
}
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update); //原子操作,你改reference是一定要加这个锁的。不加锁是绝对不可能实现的。
}