一、同步控制工具
重入锁(synchronized,wait,notify的加强版)
java.util.concurrent.locks.ReentrantLock
重入锁可以用lock,unlock手动控制,注意必须记得释放锁
重入锁可以避免死锁
1)可以反馈中断,防止两个线程相互等待造成死锁
2)tryLock()进行限时等待,防止死锁
3)synchronized锁是非公平的,重入锁是公平的
public ReentrantLock(boolean fair)
锁默认都是非公平的,因为公平锁成本更高
重入锁实现三要素
1)原子状态 用CAS存储当前锁状态
2)等待队列 没有请求到锁的线程,进入等待队列等待随机唤醒
3)阻塞原语 park() unpark()用来挂起和恢复线程
Condition条件
wait notify是和synchronized搭配使用
Condition是和重入锁搭配使用,通过Lock接口,生成一个与当前重入锁绑定的Condition对象,让线程在合适时间等待或执行
await() //使当前线程等待,并释放锁
signal() //唤醒一个在等待中的线程
Semaphore 信号量,对锁的扩展,指定多个线程访问某一个线程
ReadWriteLocks 读写锁
LockSupport 线程阻塞
park()阻塞当前线程 unpark()释放当前线程
与suspend() resume()对应
二、线程池
使用线程池,就是创建线程变成了从线程池获取空闲线程,关闭线程变成了向池子归还线程
JDK提供了Executor框架,ThreadPoolExecutor表示一个线程池
newFixedThreadPool() //创建一个固定线程数量的线程池
newSingleThreadExecutor() //创建一个只有一个线程的线程池
newCachedThreadPool() //创建一个可根据实际情况调整线程数量的线程池
内部均使用ThreadPoolExecutor方法
ThreadPoolExecutor制定了拒绝策略解决超载问题
线程池里的线程都是从ThreadFactory接口创建的
三、并发容器
JDK提供的并发容器大部分在java.util.concurrent
包中
ConcurrentHashMap 线程安全的HashMap,可高并发
ConcurrentLinkedQueue 线程安全的LinkedList,链表实现,高并发