关于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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理