java多线程(二十)线程安全集合类

基于白嫖B站黑马程序员视频:全面深入学习java并发编程,java基础进阶中级必会教程

目录

  • 1 问题
  • 2 线程安全集合类
    • 2.1 遗留的安全集合
    • 2.2 修饰的安全集合
    • 2.3 J.U.C安全集合类
  • 3 ConcurrentHashMap
    • 3.1 使用
    • 3.2 jdk 7并发死链问题

1 问题

java.util下的一些容器,是线程不安全的,当有多个线程去读写的时候,容易造成读写的不是真实的值;

2 线程安全集合类

2.1 遗留的安全集合

HashtableVector
出现时间比较早,put和get方法被synchronized关键字修饰,可以达到线程安全的目的;

2.2 修饰的安全集合

synchronizedMapsynchronizedList
经过synchronizedMap和synchronizedList修饰原不安全的容器类,调用的依然是原来的方法,synchronized锁住对象,达到线程安全的目的;

2.3 J.U.C安全集合类

Blocking类:大部分实现基于锁,并提供了用来阻塞的方法;
CopyOnWrite类:修改拷贝方式,修改开销大;
Concurrent类:性能较高,但是有弱一致性的问题;

3 ConcurrentHashMap

3.1 使用

是线程安全的,在java.util.concurrent(JUC)下。
使用时应该注意,某一个操作是原子的,不代表组合操作就是原子的,所以需要使用提供的原子操作

  • map.computeIfAbsent(K key, Function mappingFunction):如果缺少一个key,则通过计算function生成一个值value,然后把K-V键值对加入到map;如果map已经有这个key就什么都不做;返回值是value;

3.2 jdk 7并发死链问题

当新增后的链表length大于Load factor(负载因子)*length时hashMap会就行重新扩容、位置进行rehash计算,当然在单线程的情况下扩容不会出现问题,真正出现问题是在多线程情况下,同时进行扩容,进行头插入法链表会形成环,这就导致了死链的问题。一旦有任何查找元素的动作,线程将会陷入死循环,从而引发 CPU 使用率飙升。jDK8改进采用尾插入法

你可能感兴趣的:(java多线程,java,多线程,并发编程)