synchronized能够保证线程安全,但synchronized是重量级锁,性能低;可以使用CAS进行锁优化,也就是自旋锁
CAS: Compare And Swap(比较并转换)
cas(V,Expected,NewValue)
- if V== E
V = New
otherwise try again or fail
cas:V是内存中要修改的值,Expected是期望值,如果V==Expected
,就把内存中的V值改为NewValue;因为CAS是CPU原语支持的,能够保证原子性。CAS执行结果要么成功要么失败,如果失败一般开始自旋(重新尝试),或者放弃。重新尝试的时候会把Expected改成V,如果重新比较的时候,V值没有被其他线程修改的话,就自旋成功。
CAS操作过程会有潜在的ABA问题,就是有其他线程把原来的V值从A改到B,做完操作,又把B改回A;而当前线程是没办法辨别的。如果是基础数据类型,一般不会有问题,如果是指向引用,就出现如下情况:
解决方案:操作记录加version或AtomicStampedReference