Java并发
互斥锁(重量级锁)
synchronized
对象锁
不可中断
可重入
非公平
相关操作
wait/waitAll/notify/notifyAll
synchronized(object){
while(等待条件不满足){
object.wait();
}
}
ReentrantLock
可重入
可中断
分支主题
公平可设置
相关操作
condition,需要满足同一个条件的所有对象,等待同一个condition
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try{
while(条件不满足){
condition.await();
}
访问共享资源
condition.signal();
}finally{
lock.unlock();
}
ReentrantReadWriteLock
公平可设置
可重入
读共享,写互斥
读锁升级,先解锁(防死锁);写锁降级,先加锁(确保锁不丢)
自旋锁(轻量级锁)
CAS
例: AtomicInteger
偏向锁
单一线程访问同步块的场景
已有的锁被标记,不用再加锁与解锁
mark world
对象头标记区
锁标记
多线程共享变量的可见性
volatile
每次强制线程从共享内存中获取变量;更新时,也强制更新至共享内存
仅保证可见性,不保证原子性
AtomicIntegerFieldUpdaterCounter
将已有成员变量封装,使其具备原子性
死锁(抢资源导致)
一个线程同时使用两把以上的锁,就有死锁隐患
活锁(让资源导致)
其他工具
CountDownLatch
多个主线程倒计数等待子线程完成,多个主线程可继续
Latch“门闩"。开门都让大家通过,然后再关门
CyclicBarrier
主线程一直准备,设置障碍。等到指定数量子线程都到达障碍处等待,再移除障碍,使得子线程继续。
整理脑图:http://naotu.baidu.com/file/4d56449fad26594909d45e3ce962d948?token=e7e3331c75767b40