首页 > 其他分享 >集合之Map和List线程安全问题

集合之Map和List线程安全问题

时间:2022-08-31 19:11:51浏览次数:46  
标签:Map synchronized index lock List 安全 线程 null

一、Map常见的子类有:

1、HashMap:
          底层数据结构是哈希表,线程不安全,允许null键和null值

2、Hashtable:
          线程安全的,不允许null键和null值,效率低,给整个方法添加synchronized,太笨重

3、LinkedHashMap:
          底层数据结构是链表和哈希表,由链表保证有序(存储和取出的顺序一致),哈希表保证唯一,线程不安全

4、TreeMap:
          底层数据结构是红黑树(一种自平衡的二叉树),可以按照某种规则进行排序,自然排序和选择器排序,线程不安全

5、ConcurrentHashMap:
        ● 线程安全的,不允许null键和null值

        ● 对与多线程的操作,介于HashMap与Hashtable之间。

        ● 内部采用"锁分段"机制代替Hashtable的独占锁。进而提高性能。

       【查看源码:Hashtable是给整个方法上面添加synchronized,而ConcurrentHashMap是给可能出现线程安全问题的代码用同步代码块的方式加锁】

        ● 获取操作(包括 get)通常不会受阻塞

默认初始容量是16
加载因子是0.75,即当 元素个数 超过 容量长度的0.75倍 (即16*0.75=12)时,进行扩容

线程安全的LIST

List<Integer> vector = new Vector<>();
List<Integer> listSyn = Collections.synchronizedList(new ArrayList<>());
List<Integer> copyList = new CopyOnWriteArrayList<>();

  

ArrayList线程不安全:主要是多线程在写入数据时,会有重复写入的问题

Vector线程安全:主要是在添加元素的时候,加上了synchronized

public synchronized E set(int index, E element) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);

E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}


Collections.synchronizedList:主要是一个大的集合框架里面也是synchronized

public boolean add(E e) {
synchronized (mutex) {return c.add(e);}
}
CopyOnWriteArrayList:主要是使用ReentrantLock,每次添加元素都会复制旧的数据到新的数组里面,同时使用锁
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}


总结
ArrayList 单线程中使用

多线程中,并发在2000以内的使用Collections.synchronizedList;并发在2000以上的使用CopyOnWriteArrayList;Vector是JDK1.1版本就有的集合是一个重量级的,不建议使用。

标签:Map,synchronized,index,lock,List,安全,线程,null
From: https://www.cnblogs.com/zhangliang88/p/16644246.html

相关文章

  • vue——vuex四个map方法的使用
    1.mapState方法:用于帮助我们映射state中的数据为计算属性注意1:mapState的作用:用来生成重复代码,比如returnthis$store.state.xxx就非常重复,无法复用。mapState采用{k:v}......
  • [CentOS8]Repository extras is listed more than once in the configuration
    1.问题[root@localhost~]#yuminstallhttps://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpmRepositoryextrasislistedmorethanonceintheconfigu......
  • Kali Sublist3r 报错解决办法
    直接将Sublist3r.py中文件的内容替换为下面的即可具体的更改的东西改了很多地方就不细说了,直接复制粘贴如果遇到Error:Virustotalprobablynowisblockingour reque......
  • ThreadPoolExecutor 线程池的使用
    ThreadPoolExecutor这个类是JDK中的线程池类,继承自Executor,里面有一个execute()方法,用来执行线程,线程池主要提供一个线程队列,队列中保存着所有等待状态的线程。package......
  • C#线程:非排他锁
    非排他锁目的是限制并发性。信号量信号量(semaphore)就像俱乐部一样:它有特定的容量,还有门卫保护。在满员之后,就不允许其他人进入了,人们只能在外面排队。只有当有人离开时,才......
  • 并发多线程6
    第六节unique_lock(类模板)详解1.unique_lock取代lock_guardunique_lock比lock_guard灵活很多(多出来很多用法),效率差一点。unique_lock<mutex>myUniLock(myMutex);2.uni......
  • mybatis 的ResultMap和ResultType区别是什么?
     官方文档说明:ResultType:期望从这条语句中返回结果的类全限定名或别名。注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。resultType和resul......
  • 线程和进程
    进程:是计算机资源分配的最小单元(进程为线程提供资源) 进程:是计算机中可以被cpu调度的最小单元(真正工作的最小单元)  注意:Linux系统使用底层fork;win:spawn;mac支持:for......
  • 使用 JavaScript Map Method 组合 mongo 查询的算法
    使用JavaScriptMapMethod组合mongo查询的算法假设您有大量数据,并且您想查找选定品牌的特定产品,例如尼卡化妆品和一个特定的类别,例如润唇膏从中。你的代码看起来......
  • 多线程01
     一个进程可以有多个线程,至少有一个线程,比如视频中同时听声音,看图像真正的多线程是指有多个cpu,即多核,例如服务器。如果是模拟出来的多线程,在一个cpu的情况下,在同一个时......