1. AtomicReference
- 作用:保证用户自定义的class,是一个原子类型的。
2. CAS算法
- 定义:使用的就是CAS(compareAndSet)算法;不加锁,只是通过CAS算法保证操作的可靠性,正确性。不断尝试修改值,最快失败,保证了结果的最终一致性。
- 缺点:CAS只能保证最终一致性,但是会产生ABA问题;对于中间处理的一些操作是不可见的。它只保证最后的值的正确性。
3. 解决CAS的ABA问题: AtomicStampRefercence
- 主要使用的理念和Mysql的乐观锁(version)一致;通过检测stamp是否被修改,而保证ABA修改中间的操作可见性。
4. AtomicIntegerFieldUpdater
- 保证某个class的整型属性是原子性的。此属性必须使用volatile修饰,(对于访问修饰符,得注意是否可以被访问到此属性);若修饰的属性和使用的类不是一个类,是无法访问到private;其它的修饰符以此类推。。
public class AtomicIntegerFieldUpdaterTest {
public static void main(String[] args) {
AtomicIntegerFieldUpdater<Test> updater = AtomicIntegerFieldUpdater.newUpdater(Test.class, "value");
Test ts = new Test();
IntStream.rangeClosed(0, 2).forEach(item -> {
new Thread(() -> {
int value = updater.getAndIncrement(ts);
System.out.println("oldV: " + value);
}).start();
});
}
}
class Test {
volatile int value;
}
也可以改为AtomicInter去包装Integer属性
public class AtomicIntegerFieldUpdaterTest {
public static void main(String[] args) {
Test ts = new Test();
IntStream.rangeClosed(0, 2).forEach(item -> {
new Thread(() -> {
int value = ts.value.getAndIncrement();
System.out.println("oldV: " + value);
}).start();
});
}}
class Test {
AtomicInteger value = new AtomicInteger(0);
}
- 类似class:AtomicLongFieldUpdater;AtomicReferenceFieldUpdater;