JAVA并发框架
1. Executor框架
java,util.concurrent.*
- 分离任务的创建和执行者的创建
- 线程重复利用
主要类:
- ExecutorService线程池服务类(使用固定数量和动态增长创建的线程池)
- Callable接口(与runnable等价,但runnable的run()方法无返回值,Callable的call()方法有返回值)
- Future返回执行的结果
使用方法:
创建线程池:
executor=(ThreadPoolExecutor)Executors.newCachedThreadPool();//创建一个默认自增的线程池
executor=(ThreadPoolExecutor)Executors.newFixedThreadPool(5);//创建与固定线程的线程池
执行任务:
executor.execute(task); //执行 无返回值
//execute方法参数为一个runnable对象
Future<Integer> result=executor.submit(calculator);//
//参数为一个callable对象
关闭:
// 关闭线程池
executor.shutdown();
2. Fork-join框架
适用于整体任务量不好确定的场合,计算量不确定(分治编程)
常用类:
- ForkJoinPool任务池
- RecursiveAction
- RecursiveTask
3. 并发数据结构
阻塞式集合:当集合为空或者为满时,等待
非阻塞式集合:当集合为空或者为满时,不等待,返回null或异常
List:
- vector 同步安全,写多读少
- Arraylist不安全
- Collections.synchronizedList(List list)基于synchronized,效率差
- CopyOnWriteArrayList读多写少,基于复制机制,非阻塞
Set:
- HashSet不安全
- Collections.synchronizedSet(Set set)基于synchronized,效率差
- CopyOnWriteArraySet读多写少,非阻塞
Map:
- Hashtable同步安全,写多读少
- HashMap不安全
- Collections.synchronizedMap(Map map)基于synchronized,效率差
- ConcurrentHashMap读多写少,非阻塞
Queue&Deque:
- ConcurrentLinkedQueue非阻塞,也可看作一个线程安全的LinkList
- ArrayBlockingQueue和LinkedBlockingQueue阻塞型
4. 线程协作
synchronized互斥锁
Lock也可以实现同步的效果
-
tryLock方法可以预判锁是否空闲
-
允许分离读写的操作,多个读一个写
-
性能更好
-
主要类
- ReentrantLock类,可重入的互斥锁。
- ReentrentReadWriteLock类,可重入的读写锁。
- lock()和unlock()函数。