05 框架容器.txt
UP 返回
1 Fork/Join框架
多线程的目的不仅仅是提高程序运行的性能,而且可以充分利用CPU资源
以下代码模拟的是把1到100的求和不断用二分法拆分成小的任务去fork计算,最后将结果join到一起得到最终值
public class Demo extends RecursiveTask<Integer> {
private int begin;
private int end;
public Demo(int begin, int end) {
this.begin = begin;
this.end = end;
}
@Override
protected Integer compute() {
int sum = 0;
// 拆分任务
if (end - begin <= 2) {
// 计算
for (int i = begin; i <= end; i++) {
sum += i;
}
} else {
// ■拆分
Demo d1 = new Demo(begin, (begin + end) / 2);
Demo d2 = new Demo((begin + end) / 2 + 1, end);
// ■执行任务
d1.fork();
d2.fork();
// ■join结果
Integer a = d1.join();
Integer b = d2.join();
sum = a + b;
}
return sum;
}
public static void main(String[] args) throws Exception {
ForkJoinPool pool = new ForkJoinPool();
Future<Integer> future = pool.submit(new Demo(1, 99999990));
System.out.println("计算结果为 " + future.get());
}
}
2 并发容器和同步容器
2.1 同步容器
Vector -- > ArrayList
Hashtable --> HashMap
public static void main(String[] args) {
ArrayList<String> s = new ArrayList<String>();
Collections.synchronizedList(s); // ■通过这个方法可以将arraylist变为线程安全的
HashMap<String, Object> map = new HashMap<>();
Collections.synchronizedMap(map);
}
2.2 并发容器 解决同步容器性能低效的问题
ArrayList -- > CopyOnWriteArrayList
CopyOnWriteArrayList在写数据时会先将旧数据复制一份,这样就不影响读,否则直接加锁是读不了的。对复制的那一个数组加锁写,写好以后再将引用指向新的地址。读写分离提高性能
如果在多线程中读操作相对写有很多,么CopyOnWriteArrayList可以大大提高性能;但是如果写操作更多,考虑到每次写都得复制数组,这时使用同步容器可能更好
CopyOnWriteArrayList<String> s = new CopyOnWriteArrayList<String>();
HashMap -- > ConcurrentHashMap
ConcurrentHashMap通过hash将整个map分成多个小的表,这样在put的时候只用锁住对应的小表,不影响其他小表的读写操作
非阻塞队列ConcurrentLinkedQueue 通过cas实现多线程安全问题。非阻塞队列添加移除时,不会因为队列的元素个数而停止,顶多返回空或者抛异常任由处理
head和tail指针一开始都是指向第一个结点,添加元素时(offer方法),如果tail的next为null,则直接在队列后添加新节点,tail不变;如果不为null,则添加新节点同时把tail指向新节点。故每奇数次添加tail是不变的,偶数次添加会变动。
移除元素时(poll方法),如果head指针不为null,则直接将其变为null;如果是null,则head后移,并将该节点变null并移除,同时head再次后移
阻塞队列BlockingQueue 适用于生产者消费者模型。阻塞队列在队列空时移除线程将等待,在队列满时添加线程将等待
private BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(10);
其中:put take方法会阻塞;add remove方法会抛出异常;offer poll方法有返回值
3 消息队列 对应视频50
DOWN 返回