关于集合中的线程安全问题
仅供参考,如有错误,请指正!
集合中线程安全的类有:vector,stack,hashtable,enumeration,除此之外均是非线程安全的类与接口,简单记忆线程安全的集合类: 喂!SHE! 喂是指 vector,S是指 stack, H是指 hashtable,E是指:Enumeration(转载自牛客网)
线程安全的集合有:
List接口下的:Vector、CopyOnWriteArrayList、Collections.synchronizedList();
Set接口下的:CopyOnWriteArraySet、synchronizedSet;
Map接口下的:Hashtable、ConcurrentHashMap等。
其中比较常见的集合:Vector、HashTable等实现线程安全的方式是通过synchronized关键字加锁来保证线程安全。
Vector:
首先来看一下Vector为什么线程安全,查看源码,发现竟然有这么多的synchronized,Vector源码中对于很多方法都加上了synchronized关键字,synchronized相当于一把锁,在执行这些方法的时候会锁住线程,这样就使得Vector在线程上是安全的。
Stack:
说起Stack的线程安全,首先要看一下它的继承关系,Stack是Vector的子类,所以自然而然Stack同样线程安全:
在Stack中的一些方法也是加上了synchronized关键字实现了它的线程安全:
HashTable:
首先看一下HashTable的继承关系:
和Vector一样,HashTable线程安全的主要原因还是在源码中加入了synchronized线程锁控制:
大意如下:
Java集合框架。与新的集合实现不同,Hashtable是同步的(线程安全)。如果不需要线程安全的实现,建议使用HashMap代替Hashtable。 如果需要线程安全的高并发实现,那么建议使用java.util.concurrent.ConcurrentHashMap代替Hashtable。
在HashMap中同样有以下说明:
大意如下:
注意,这个实现不是同步的。 如果多个线程并发地访问一个散列映射,并且至少有一个线程在结构上修改了该映射,则必须从外部同步该映射。 (结构修改是任何添加或删除一个或多个映射的操作; 仅仅更改与实例中已经包含的键相关联的值不是结构修改。) 这通常是通过对某个自然封装了映射的对象进行同步来实现的。
线程安全的集合就一定线程安全吗?这种线程安全叫做相对线程安全,即可能由于线程顺序的不一致导致线程不安全。
关于集合中的线程安全问题相关推荐
- java集合类的线程安全_Java集合中的线程安全问题
介绍 JDK中提供了很多集合实现,本文不会介绍有哪些集合的接口以及实现类,而是介绍如何在多线程情况下使用这些集合. - 如果您还不太了解Java的整个集合体系的话,请查看<Java开发成长之路第 ...
- parallelStream中的线程安全问题
parallelStream中的线程安全问题 在面试的时候很多人喜欢问并发编程,那么在实际开发中我们能用到多少呢?今天在这里举个例子就是实际开发中的并发编程的问题.在我们经常写的业务代码中很多时候会出 ...
- 多线程中的线程安全问题
多线程中的线程安全问题 概述: 多条线程在操作同一个资源的时候发生的数据交叉问题就是线程安全问题 产生原因: 多条线程操作同一个资源 解决思路: 要线程排队解决安全问题,设定权限. 如何设 ...
- HashMap1.7中的线程安全问题
文章目录 前言 正文 前言 下面聊聊JDK1.7HashMap的死循环问题,在这之前首先要知道JDK1.7的HashMap底层是数组 + 链表的形式的 正文 下面给出JDK1.7的扩容代码 //扩容代 ...
- Java单例模式中的线程安全问题
在Java中单例模式被分为懒汉式和饿汉式,饿汉式会在单例类加载时就创建实例而懒汉式则延迟实例化,在使用到单例实例的时候才实例化.在单线程的程序里两张方式没什么区别,多线程的话懒汉式会有线程安全问题.先 ...
- java中SimpleDateFormat线程安全问题及解决方案
最近看到一篇文章提到了SimpleDateFormat这个类.说这个类在单线程程序中没问题,但是在多线程环境下会线程安全的问题. 出于兴趣对这个问题进行了查证.网上有很多关于这个问题的文章,也解析了其 ...
- hashmap扩容线程安全问题_HashMap在1.7 1.8中的线程安全问题
HashMap的线程不安全主要体现在下面两个方面: 在JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况. 在JDK1.8中,在并发执行put操作时会发生数据覆盖的情况. ? ? 常被问 ...
- python中list线程安全问题
严格意义上说,只有操作才有是否安全的定义,因为线程是否安全,针对的不是对象,而是操作. 如果我们指这样的操作L[0] = L[0] + 1,它当然不是一个原子操作,不加以保护就会导致线程不安全,而L. ...
- servlet单实例多线程 ---线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。(所有建议不要在servlet中定义成员变
Servlet 单例多线程 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servl ...
最新文章
- mybatis mapper xml文件的导入方式和查询方式
- 注入(二):修改导入表(c++)
- 4. 用MVC实现URL路由
- Android 10分钟集成极光推送
- 前端跨域请求get_(单点登录)跨域SSO看这篇文章就够了:前端篇
- 在Kubernetes上运行区块链服务(BaaS)
- SpringBoot与安全
- JAVA互联网应用架构师、JAVA架构、JAVA中间件、集群等互联网应用
- 微软实习期的我,纠正了一位高级开发人员的错误......
- Python 网络爬虫与数据采集(一)
- Robo 3T(Studio 3T)最新版安装教程
- DeepFace人脸检测(python实现)
- python曲线拟合预测_数据预测与曲线拟合
- 计算机移动监控,AI技术和5G技术赋能移动监控领域,加速移动监控产品的迭代...
- python程序实现最大限度突破高德地图爬虫限制,包括.exe文件的编译,提供最大限度爬虫高德地图poi思路
- C#实现触摸屏自定义键盘
- [转]数码单反和普通数码相机的差别
- Mobaxterm X server远程Linux服务器使用浏览器(firefox或google chrome)
- Linux和Windows设备驱动架构比较
- java基础 第一章 对象入门
热门文章
- opencv(python)使用svm算法识别手写数字
- 计算机毕业设计Java医院病房管理系统(源码+系统+mysql数据库+lw文档)
- cutycapt php,PHP利用CutyCapt获取网页快照,抓取网页高清图片快照(教程)
- 误区:初创企业不应该注重网络安全防护
- 计算机二级使用宏,计算机等级考试二级Access宏的使用教程
- Adobe终于在Flash Player 11和Air 3上支持3D了
- 手机指纹识别测试软件,指纹测算机安卓版(手机指纹测性格应用)V5.1.3 最新免费版...
- Python金融数据挖掘 第八章 复习思考题2
- 在Win10系统中使用独立浏览器 Internet Explorer 11 的解决方案(原创)
- uniapp 支付宝小程序手机号登陆