乐趣区

关于java:多线程与高并发二

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
退出移动版