synchronized

锁降级的概念:

sync(Object)
第一个线程进入后,markword记录这个线程的ID(偏差锁)
如果有线程争用:降级为自旋锁
自旋10次当前,降级为重量级锁(OS)
线程数少--自旋锁 线程数多--重量级锁
操作耗费工夫短--自旋锁 操作耗费工夫长--重量级锁

volatile

保障线程可见性

对于主存中一个数据来说,默认状况下启动一个线程,线程a从主存中读取到后,会copy到线程缓存中,此时如果有另外一个线程更新了主存中的数据,然而a线程并不会再去主存中读取,造成线程之间的不可见。应用volatile,能够使线程a每次在用到这个数据时。都去主存中从新读取一次,这样就保障了线程之间的可见性
volatile援用类型只能保障援用自身的可见性,不能保障外部字段的可见性,也就是说,如果一个对象的援用被volatile润饰,此对象的属性更新是不可见的,只有该援用的对象产生了变动才是可见的。

禁止指令重排序

AtomicXXX

CAS
LongAdder

各种JUC同步锁

ReentrantLock
CountDownLatch
CyclicBarrier
Phaser
ReadWriteLock
Semaphore
Exchanger
LockSupport