Volatile保证线程可见性
--MESI
--缓存一致性协议 线程可见性在CPU级别是通过缓存一致性协议保证的
Volatile禁止指令重排序(CPU)
指令重排序在CPU级别是无法禁止的,因为是在CPU内部运行的原理。而在jvm中加上volatile关键字是可以实现禁止指令重排序的,volatile给CPU发出指令,CPU中有原语指令
loadfence(读屏障)和storefence(写屏障)的操作
- DCL单例
-Double Check Lock
-Mgr06.java
Volatile不能保证原子性
CAS(无锁优化 自旋)
1.Compare And Set/Swap
2. cas(V,Expected,NewValue)V,原始值;Expected,期望当前的值是什么;NewValue,要设定的新值
--if V ==E
V=New
Otherwise try again or fail
--CPU原语支持
3.ABA问题的解决 加version 比较上一个值的version。cas(version)
AtomicInteger,AtomicLong,LongAdder。AtomicXXX->CAS
Increment->sync atomicXXX
各种JUC同步锁
ReentrantLock vs synchronized 区别
- ReentrantLock需要程序手动加锁和手动解锁,sync系统自动加锁和自动解锁
- R有各种condition(等待队列),sync没有
- 底层实现:
ReentrantLock是CAS的实现,sync默认进行四种锁状态的升级
ReentrantLock 可以替代 synchronized,底层是cas vs sync,trylock,lockinterupptibly,可以在公平锁和非公平锁两者之间切换
ReentrantLock 默认false,非公平锁
公平锁概念:线程来获取资源时看queue里有没有线程在排队,如果有就要排队等着。
非公平锁:线程来获取资源时不管queue里有没有线程在排队,上来就抢锁
CountDownlatch 倒数门闩锁
CyclicBarrier 循环栅栏锁
Phaser 阶段锁
ReadWriteLock-StampedLock 读写锁的概念就是共享锁和排它锁,读锁:共享锁,写锁:排它锁
Semaphore 信号灯,使用于限流。场景,卖票,车道,收费站
公平锁与非公平锁,它默认是非公平的
Semaphore的主要方法摘要:
void acquire():从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。
void release():释放一个许可,将其返回给信号量。
int availablePermits():返回此信号量中当前可用的许可数。
boolean hasQueuedThreads():查询是否有线程正在等待获取。
原文链接:https://blog.youkuaiyun.com/u013851082/article/details/70208246
Exchanger交换器, 用于线程间交换数据。Exchanger.exchange() 方法是阻塞的
LockSupport.park 停车,LockSupport.unpark开车