当前位置:   article > 正文

JAVAEE中的线程安全的集合类(包括Hashtable&ConcurrentHashMap)_java table 线程安全

java table 线程安全


线程安全的集合类

标准库里面大部分的集合类,都是线程不安全的~~
少数几个线程安全的 : Vector,Stack,HashTable 虽然线程安全,但是其实不太推荐用

在这里插入图片描述

一、多线程环境使用 ArrayList

  1. 如果需要在多线程环境下保证集合类的线程安全,最简单的做法,就是自己加锁~
  2. 使用: Collections.synchronizedList(new ArrayList);
    其实就是套了一层壳,壳上加锁了~~
    但是这个做法有点简单粗暴,就是无脑的给各种方法都加上锁…
  3. 使用 CopyOnWriteArrayList 不加锁保证线程安全
    适用的场景有限,一写多读,写的频率较低才比较适合用
    CopyOnWrite: 写(修改)时拷贝(复制),就是写了什么就把它复制一份
    在这里插入图片描述这个操作适用范围非常有限~ 如果元素特别多/修改特别频繁,就不适合使用这种方式了~
    但是这种写时拷贝的思想,很多地方都会用到~ 一个典型的,显卡给显示器渲染画面,也是类似的操作 在这里插入图片描述

在这里插入图片描述

二、多线程环境使用哈希表

HashMap 本身不是线程安全的.
在多线程环境下使用哈希表可以使用:

  • Hashtable
  • ConcurrentHashMap
    在这里插入图片描述

1. Hashtable

只是简单的把关键方法加上了 synchronized 关键字,不推荐使用

因为最大的问题是属于Hashtable无脑给各种方法加 synchronized
而加锁是需要因地制宜的,所以这种方法其实是不太合理的!

2.ConcurrentHashMap(推荐使用)

ConcurrentHashMap背后做了很多优化策略!

优化策略:

  1. 锁粒度的控制

HashTable 直接在方法上加synchronized,相当于是对 this加锁,而this只是针对哈希表对象来加锁,一个哈希表只有一个锁…
意味着: 
多个线程,无论这些线程都是如何操作这个哈希表,都会产生锁冲突!!

HashTable:在这里插入图片描述

多个线程,无论这些线程都是如何操作的这个哈希表,都会产生锁冲突了!


ConcurrentHashMap做出了改进~
在这里插入图片描述
ConcurrentHashMap不是一把锁,而是多把锁 ~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/535171
推荐阅读
相关标签