条件队列
- 条件队列中的元素是一个个正在等待相关条件的线程
- 相关条件叫条件谓词
监视器:(Java的内置锁)
Java的内置锁也称为监视器锁或监视器。
进入和退出同步代码块的字节指令也称为monitorenter和monitorexit。
多线程工具包
Executor体系
显示锁Lock(CAS实现)
CAS的全称为compare and swap。是一种CPU原子指令,通常有三个参数:内存地址、旧值、新值。轻量级的锁。
监视器借助内核互斥锁mutex实现,从用户态切换到内核态,量级较重。
显示条件队列Condition
- 各种类型的线程管理通过AQS来完成,全称为AbstractQueueSynchronizer。
- AQS是同步框架,它主要进行两个方面的工作:资源状态的管理和资源申请者的管理。
具体对应为:一个volatile int state (代表共享资源) 和多个线程等待队列。
乐观锁与悲观锁:
悲观锁:假设一定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。(适用于并发冲突频率高的场景)
1
如: 监视器借助mutex————内核级别的互斥锁。
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。(适用于冲突频率低的场景)
1
如: 显示锁使用CAS————CPU原语指令。
多线程常用类
- ThreadLocal
volatile
- 将修改的值强制刷新到主存
- 通知其他相关线程变量已经失效
- 其它线程再使用变量时,会重新从主存读取
- 可见性和原子性
- 典型的应用场景(多线程中的标记位 DCL单例模式 简单的内存缓存)
ConcurrentHashMap
线程安全问题的本质:
多线程并发访问共享的可变变量,需要注意线程安全问题。
- 多线程
- 共享
- 可变
死锁的4个必要条件:
- 互斥访问
- 非抢占
- 持有并等待
- 循环等待
在Java编程中,有三种典型的死锁代码:
静态的锁顺序死锁
1
两个方法使用锁的顺序颠倒造成死锁
动态的锁顺序死锁
1
两个线程使用参数锁的顺序颠倒
协作对象之间发生的死锁
1
持有一个对象锁的情况下对另一个对象的方法调用
Java并发工具包
java.util.concurrent
java.util.concurrent.atomic
java.util.concurrent.locks
- AtomicInteger: AtomicBoolean等原子变量
- CountDownLatch(闭锁、门):在多线程执行过程中设置闭锁,只有当闭锁打开时,线程才能继续执行。
- Semophore(信号量):控制同时访问某个资源或者进行某种操作的线程数量。
- CyclicBarrier(栅栏):阻塞多个相关的线程,一直到某个时间发生。
- Collections(工具类):创建并发容器,比如Collections.synchronizedList(new ArrayList