1、CAS原理
(1)CAS:(https://www.cnblogs.com/zhai1997/p/13467606.html)
2、CAS和volatile实现无锁并发
public class Test { public static void main(String[] args) throws InterruptedException { AtomicInteger atomicInteger = new AtomicInteger(); Runnable mr = () -> { for (int i = 0; i < 1000; i++) { atomicInteger.incrementAndGet(); } }; ArrayList<Thread> ts = new ArrayList<>(); for (int i = 0; i < 5; i++) { Thread t = new Thread(mr); t.start(); ts.add(t); } for (Thread t : ts) { t.join(); } System.out.println("number = " + atomicInteger.get()); } }
AtomicInteger的源码中包括Unsafe类,Unsafe类提供了原子操作
3、Unsafe类
Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。过度的使用Unsafe类会使得出错的几率变大,因此Java官方并不建议使用的,官方文档也几乎没有。Unsafe对象不能直接调用,只能通过反射获得。
CAS的这种机制我们称之为乐观锁,综合性能较好
CAS获取共享变量时,为了保证该变量的可见性,需要使用volatile修饰。结合CAS和volatile可以实现无锁并发,适用于竞争不激烈、多核 CPU 的场景下。
- 因为没有使用 synchronized,所以线程不会陷入阻塞,这是效率提升的因素之一
- 但如果竞争激烈,可以想到重试必然频繁发生,反而效率会受影响