我想知道原子类中set()和compareAndSet()之间的区别。 set()方法是否也确保原子过程?例如这段代码:
public class sampleAtomic{
private static AtomicLong id = new AtomicLong(0);
public void setWithSet(long newValue){
id.set(newValue);
}
public void setWithCompareAndSet(long newValue){
long oldVal;
do{
oldVal = id.get();
}
while(!id.compareAndGet(oldVal,newValue)
}
}
这两种方法是否相同?
答案 0 :(得分:8)
set
和compareAndSet
方法的行为不同:
set()方法是否也确保原子进程?
是。它是原子的。因为set
新值只涉及一个操作。以下是set
方法的源代码:
public final void set(long newValue) {
value = newValue;
}
答案 1 :(得分:-1)
正如您从下面的开放式jdk代码中看到的那样。
set
只是分配值而compareAndSet
正在执行额外操作以确保原子性。
设计任何原子操作时需要考虑返回值(布尔值)。