Java并发常见概念总结

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

原文地址:https://www.cnblogs.com/daition/p/6908563.html