JDK并发包

JDK并发包简介

[TOC]

同步控制

1. synchronized扩展:重入锁 ReentrantLock

必须手动指定加解锁,提高逻辑控制灵活性

中断响应

lock.lockInterruptibly()可被Thread.interrupt()中断

可设置超时

lock.tryLock(5, TimeUnit.SECONDS) 超时返回false

公平锁

new ReentrantLock(true) 可生成公平锁

2. 信号量 Semaphore

控制同时执行的线程数

3. 读写锁 ReadWriteLock

1
2
3
readWriteLock = new ReentrantReadWriteLock()
readLock = readWriteLock.readLock()
writeLock = readWriteLock.writeLock()

两把锁会根据读写关系阻塞

4. 倒计时 CountDownLatch

用于等待有确切数量的进程完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void CountDownLatchDemo(){
ExecutorService exec = Exectors.newFixedThreadPool(10);

for(int i = 0; i < 10; i++)
exec.submit(new CheckTask);
}
end.await();
// 阻塞直到10个线程全结束
}

public class CheckTask implements Runnable{
static final CountDownLatch end = new CountDownLatch(10);

@Override
public void run(){
// do some check
end.countDown();
}
}

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
2
3
4
5
6
7
8
es.submit(new MyTask());

public class MyTask implements Runnable{
@Override
public void run (){
...
}
}

JDK并发容器

1. ConcurrentHashMap 高效且线程安全的HashMap

2. CopyOnWriteArrayList 安全的ArrayList。在读多写少场合性能远远好于Vector

3. ConcurrentLinkedQueue 高效且安全的LinkedList

4. BlockingQueue 阻塞队列接口,用于数据共享通道

5. ConcurrentSkipListMap 跳表实现,用于快速查找

Collections工具可以将任意容器包装为线程安全的容器,例如
public static Map m = Collections.synchronizedMap(new HashMap());