07-JUC--并发容器

并发容器概览

ConcurrentHashMap;线程安全的HashMap
CopyOnWriteArrayList:线程安全的List
BlockingQueue:这是一个接口,表示阻塞队列,非常适用于作为数据共享的通道。
ConcurrentLinkedQueue:高效的非阻塞并发队列,使用链表实现。可以看做一个线程安全的LinkedList
ConcurrentSkipListMap:是一个Map,使用跳表的数据结构进行快速查找。

集合类的历史

Vector和Hashtable

使用了synchronized,并发性能较差。

ArrayList和HashMap

虽然这两个类不是线程安全的,但是可以用 Collections.synchronizedList(new ArrayListt)和 Collections.synchronizedMap(new HashMap<K,V>())使之变成线程安全的。

ConcurrentHashMap

  1. Map简介
  2. 为什么需要ConcurrentHashMap
  3. HashMap的分析
  4. JDK1.7的ConcurrentHashMap实现和分析
  5. JDK1.8的ConcurrentHashMap实现和源码分析
  6. 对于JDK1.7和JDK1.8的优缺点,为什么要把1.7的结构改成1.8的结构?
  7. 组合操作: ConcurrentHashMap也不是线程安全的
  8. 实际生产案例

Map简介

在这里插入图片描述

Map接口常用方法


/**
 * @Classname MapDemo
 * @Description 演示Map的基本用法
 * @Date 2021/2/26 10:23
 * @Created by YoungLiu
 */
public class MapDemo {
    
    
    public static void main(String[] args) {
    
    
        Map<String,Integer> map = new HashMap<>();
        System.out.println(map.isEmpty());
        map.put("123",23);
        map.put("456",12);
        System.out.println(map.keySet());
        System.out.println(map.get("123"));
        System.out.println(map.size());
        System.out.println(map.containsKey("123"));
    }
}

为什么HashMap是线程不安全的?

  1. 同时put碰撞导致数据丢失
  2. 同时put扩容导致数据丢失
  3. 死循环造成的CPU100%

死循环造成的CPU100%

在多个线程同时操作hashmap时候,会造成链表的死循环,你指向我,我指向你。

hashmap分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
ConcurrentHashMap的putVal流程

在这里插入图片描述
ConcurrentHashMap的get流程

在这里插入图片描述

CopyOnWriteArrayList

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

并发队列

为什么要使用队列

用队列可以在线程间传递数据:生产者消费者模式、银行转账

  1. Queue
  2. BlockingQueue
    在这里插入图片描述

BlockingQueue 阻塞队列

1. 什么是阻塞队列

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 主要方法介绍

在这里插入图片描述

3. ArrayBlockingQueue

在这里插入图片描述

4.LinkedBlockingQueue

在这里插入图片描述

5. PriorityBlockingQueue

在这里插入图片描述

6. SynchronousQueue

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

非阻塞并发队列

在这里插入图片描述

总结

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41729287/article/details/114115552