AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是用 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
AQS 定义两种资源共享方式:
1.公平锁:按照线程在队列中的排队顺序,先到者先拿到锁
2.非公平锁:当线程要获取锁时,先通过两次 CAS 操作去抢锁,如果没抢到,当前线程再加入到队列中等待唤醒。
CAS:它是一条CPU并发原语,也是一种无锁算法。
它的功能是在不使用锁的情况下实现多线程之间共享变量的同步。算法思想:判断内存某个位置的值是否为预期值,如果是则更新为新的值,这个过程涉及到三个参数,分别是:内存地址,期望的值以及要修改的值。并且该操作是原子的。
缺点:
1.由于使用了do while循环,如果多次比对不正确,循环次数变多开销大,效率变低
2.CAS是对原子包装类的操作,所以只能保证一个共享变量的原子性。
3.会引发ABA问题
ABA问题的解决方案:
让原子包装类对象带上版本信息,给对象带上标记,那么在进行比较的时候就不仅要比对内容是否相同,还需要比对版本是否一致。
所以可使用AtomicStampedReference类来实现这一功能,该类是在原子引用类的基础上加上了时间戳的概念