JDK并发包简介
[TOC]
同步控制
1. synchronized扩展:重入锁 ReentrantLock
必须手动指定加解锁,提高逻辑控制灵活性
中断响应
lock.lockInterruptibly()可被Thread.interrupt()中断
可设置超时
lock.tryLock(5, TimeUnit.SECONDS) 超时返回false
公平锁
new ReentrantLock(true) 可生成公平锁
2. 信号量 Semaphore
控制同时执行的线程数
3. 读写锁 ReadWriteLock
1 | readWriteLock = new ReentrantReadWriteLock() |
两把锁会根据读写关系阻塞
4. 倒计时 CountDownLatch
用于等待有确切数量的进程完成
1 | public void CountDownLatchDemo(){ |
5. 循环栅栏 CyclicBarrier
CyclicBarrier cyclic = new CyclicBarrier(N, new BarrierRun(...));
当执行cyclic.await()未达到N次时,一直阻塞,直到第N次后执行BarrierRun线程,且cyclic解锁
cyclic可以继续await(),继续触发BarrierRun
线程池
1. 固定大小 newFixedThreadPool 空闲就执行,满了就队列等待
2. 单线程池 newSingleThreadPool 大小为1的 newFixedThreadPool
3. 大小不固定 newCachedThreadPool 满了会创建新的线程
4. 单线程任务计划 newSingleThreadScheduledExecutor 可以延时/周期执行,大小为1
5. 多线程任务计划 newScheduledExecutor
生成线程池方法ExecutorService es = Executors.newFixedThreadPool(5)
执行线程
1 | es.submit(new MyTask()); |
JDK并发容器
1. ConcurrentHashMap 高效且线程安全的HashMap
2. CopyOnWriteArrayList 安全的ArrayList。在读多写少场合性能远远好于Vector
3. ConcurrentLinkedQueue 高效且安全的LinkedList
4. BlockingQueue 阻塞队列接口,用于数据共享通道
5. ConcurrentSkipListMap 跳表实现,用于快速查找
Collections工具可以将任意容器包装为线程安全的容器,例如public static Map m = Collections.synchronizedMap(new HashMap());