线程安全的集合类-程序员宅基地

技术标签: jvm  java  JavaEE  多线程  开发语言  

Java中提供了许多集合类,其中有的是线程安全的,有的是线程不安全的。线程安全的集合类有:

1. Vector:Vector类实现了一个动态数组,与ArrayList相似,但Vector是同步访问的

2. Stack:Stack是Vector的一个子类,实现了一个“后进先出”的栈

3. Hashtable:Hashtable是一个散列表,与HashMap类似

Hashtable在关键方法上加上了synchronized,相当于对this加锁(整张表都加上锁),则Hashtable只有一把锁,即使是修改或读取不同链表上的元素,也会触发锁冲突

通过上图我们可以发现:读取数据时不涉及到线程安全问题,修改两个不同链表上的元素时,也不会涉及线程安全问题,而当修改的是同一链表上的元素时,则可能会涉及到线程安全问题。

因此,针对读取操作,无需加锁,不同链表的操作,也无需加锁,而当针对同一链表操作时,需要加锁,此时,我们可以考虑使用ConcurrentHashMap

4. ConcurrentHashMap:ConcurrentHashMap能够做到读数据不加锁,且在进行写操作时锁的粒度更小,可以允许多个修改操作并发进行,Java 1.7及其之前,ConcurrentHashMap是通过“分段锁”来实现的,即给若干链表分配一把锁,然而这种方法需要引入额外的空间开销,且实现更复杂

因此,从Java 8 开始,就变成了每个链表一把锁了

此时,若不是操作同一个链表的锁,就不会发生锁冲突

然而此种方法是否需要更多的空间?

不会产生更多的空间代价。Java中任意一个对象都可以直接作为锁对象。哈希表中本就需要有数组,数组的元素都是已经存在的(每个链表的头节点),此时,只需使用链表的头节点(数组元素)作为锁对象即可

且ConcurrentHashMap针对扩容也进行了优化。

Hashtable一旦触发扩容,就由该线程完成整个扩容操作,此时可能会涉及到大量的元素拷贝,因此效率会较低,耗时较长

而ConcurrentHashMap则是采用“化整为零”的方法,即当发现需要扩容时,创建一个新的数组,同时搬运几个元素过去,后续每次线程操作ConcurrentHashMap时,都会搬运元素,每次操作搬运一部分元素。在此扩容期间,新旧数组同时存在。当搬运完最后一个元素时,再把旧数组删掉。在此期间内,插入数据只会向新数组中插入,而查找需要同时查询新数组和旧数组

5. synchronizedList:synchronizedList是标准库中提供的一个基于sychronized进行线程同步的list。synchronizedList的关键操作上都带有synchronized

6. CopyOnWriteArrayList:CopyOnWrite即写时拷贝,当读取顺序表时,此时无线程安全问题,而当有线程要修改其中的值时,就会将list复制一份,修改新表中的内容,并修改引用的指向(操作是原子的,无需加锁)

 然而因此此种操作需要进行复制,因此修改操作不能太频繁且表也不应太大

除此之外,也可以根据需求,使用synchronized或ReentrantLock自己实现线程安全的ArrayList

7. BlockingQueue(阻塞队列)

ArrayBlockingQueue:基于数组实现的阻塞队列

LinkedBlockingQueue:基于链表实现的阻塞队列

PriorityBlockingQueue:基于堆实现的带有优先级的阻塞队列

...

虽然以上这些类都是线程安全的,但也不一定能够满足我们多线程操作的需求,因此我们需要根据实际情况选择使用或自己加以实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2301_76161469/article/details/135641250

智能推荐

win10使用roLabelimg(可标注旋转矩形)保存带有汉字的label及xml转txt(含文件)_rolabellmg下载-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏22次。win10使用roLabelimg保存带有汉字的label(含文件)简介roLabelimg可以标注旋转矩形,虽不太好用,但比不能标注强太多太多,转载请注明出处。文件地址源文件修改&编译将roLabelImg.py中的#!/usr/bin/env python# -*- coding: utf8 -*-更改为#!/usr/bin/env python# -*- coding: utf-8 -*-编译pyrcc5 -o resources.py resources.qrc_rolabellmg下载

对Neo4j导出数据做知识图谱可视化 D3库实现_neo4jd3-程序员宅基地

文章浏览阅读2.5w次,点赞52次,收藏360次。知识图谱可视化 D3库的使用引言Neo4j导出数据引言好久没用D3库作可视化了,现在主要是用百度的echarts库,在项目中做简单的图表太方便了。但像是做关系图其实用echarts也很方便,这次用D3实现主要是复习一下以前做的东西,顺便记录一下。以下是我参考到的实例代码:D3官方图实例参考echarts做关系图实例参考Neo4j导出数据我们先通过Cypher查询将数据从Neo4j中查询出来,Neo4j构建和查询可以参考我上篇博客基于Neo4j的外贸企业关系图谱做企业相似度查询查询后的结果如下_neo4jd3

拓扑空间、距离空间、向量空间和内积空间_拓扑和距离的关系-程序员宅基地

文章浏览阅读7.5k次。拓扑空间是最基本的,是集合+开集构成,这个空间里没有距离。就像人群+关系=社会一样。距离空间=拓扑空间+距离。这个距离的来源主要是定义出来的。距离空间是拓扑空间的一个子集,也可以理解为是一个子概念。同理向量空间又是距离空间的一个子集,子概念。对拓扑向量空间来说,它是一个度量空间当且仅当其有可数局部拓扑基(见Rudin的泛函分析,对一般拓扑空间来说的充要条件还要多一个,这就是NS度量化定理,见Munk_拓扑和距离的关系

dubbo实战之一:准备和初体验,Java进阶-程序员宅基地

文章浏览阅读923次,点赞21次,收藏15次。Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

20来行的Python拼写检查器_拼写检查 专有名词 python-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏8次。介绍了一个基于贝叶斯方法的Python写的20来行的拼写检查器_拼写检查 专有名词 python

matlab仿真三相不平衡度,matlab调用openDSS进行三相不平衡潮流计算-程序员宅基地

文章浏览阅读2k次。应用介绍这是使用matlab调用openDSS进行三相不平衡潮流计算过程和方法步骤,OpenDSS是由美国电科院(EPRI)开发的开源配电系统仿真工具。 用户可以在使用COM接口的同时使用OpenDSS仿真任何配电网系统(有关详细信息,请参见OpenDSS手册)。 在这里,OpenDSS使用Matlab COM接口用于配电系统的潮流计算。 以下讲述了从安装到openDSS潮流计算,如何定义各个分布..._opendss matlab安装

随便推点

洛谷3356火星探险问题-程序员宅基地

文章浏览阅读91次。题目链接:火星探险问题这一题类似于深海机器人问题唯一的区别是这一题的资源不再位于边上而位于点上,由于资源只能开采一次所以需要考虑拆点接下来就和那一道问题一样了接下来又是喜闻乐见的输出方案了我们从源点出发,每一次dfs向东走还是向南走,记录一个当前枚举方案时的流量,当某条边的记录流量与原本应当流的流量相同时则说明不能再从这里走,否则就顺着这里向下dfs注意及时return#i..._洛谷 u90034 题目 神秘岛探险

python写一个类600行代码_带你领略算法的魅力,一个600行代码的分词功能实现(二)...-程序员宅基地

文章浏览阅读127次。从大学毕业到工作的开始几年,一直觉得大学期间学的线性代数,离散数学,概率论简直是浪费时间。那时候实际做的代码,大部分都是数据进销存。数据输入到数据库介质中的转换,CS,BS架构都写过一些。总觉得现实生活中的逻辑,基本就是柴米油盐那么点东西,根本不需要复杂的算法。最多用点排序算是最给面子了。真正接触算法的魅力,是在写游戏的时候。那时候写寻路算法,第一次听说A*,不喜欢用别人写好的,于是自己实现了一遍..._python中型游戏600行代码

java智慧农业系统-农业云端农产品仓储子系统_农产品货运客体子系统-程序员宅基地

文章浏览阅读1.9k次。下载地址:https://download.csdn.net/download/kzpqi88/80784670项目介绍:java智慧农业系统-农业云端农产品仓储子系统系统说明:1、主要功能计费配置、仓库配置、基础配置、计费管理、基础资料、仓库管理、月台管理、进货管理、出货管理、退货管理、库内管理、盘点管理、库存查询、PDA功能、分析报表、分析图表、域验证。2、主要流程收货流程,上架流程,移货作业、拣货流程:批量拣货,按单拣货、盘点流程、计费流程。1,开发环境:开发工具:IDEA(强烈_农产品货运客体子系统

总结 XSS 与 CSRF 两种跨站攻击_restclient测试xss-程序员宅基地

文章浏览阅读1k次。在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式。在这个年代, 参数化查询 [1] 已经成了普遍用法,我们已经离 SQL 注入很远了。但是,历史同样悠久的 XSS 和 CSRF 却没有远离我们。由于之前已经对 XSS 很熟悉了,所以我对用户输入的数据一直非常小心。如果输入的时候没有经过 Tidy 之类的过滤,我一定会在模板输出时候全_restclient测试xss

分享一个在线生成微信跳转链接实现微信内跳转浏览器打开URL的工具-程序员宅基地

文章浏览阅读2.5k次。前言现如今微信对第三方推广链接的审核是越来越严格了,域名在微信中分享转发经常会被拦截,一旦被拦截用户就只能复制链接手动打开浏览器粘贴才能访问,要不然就是换个域名再推,周而复始。无论是哪一种情况都会面临一个非常严重的问题,那就是用户体验差,用户量无法有效地累积起来,从而导致推广成本一直在增加,推广效率却无法有明显的提升。所以针对这个问题,特写这篇文章来分享如何正常从微信内访问已..._mailijump

使用Monkey进行Android手机应用的压力测试_monkey压力测试-程序员宅基地

文章浏览阅读547次。由于monkey太过随机,最后根本无法控制,很容易陷于一个页面无法出来,或者陷入某个无关紧要的地方无法出来,导致测试结果并不具有很好的意义。在monkey测试中,由于事件的随机性,使得monkey容易卡在某些简单页面,比如登陆页面这种可操作内容很少的页面。***执行100个伪随机用户事件流,事件间隔为300毫秒: adb shell monkey -p 包名 --throttle 300 100。由于Monkey的随机性,如果Bug是由于事件发生的特定序列产生的,往往很难复现Bug。_monkey压力测试

推荐文章

热门文章

相关标签