java集合类的线程安全_Java集合中的线程安全问题
介绍
JDK中提供了很多集合实现,本文不会介绍有哪些集合的接口以及实现类,而是介绍如何在多线程情况下使用这些集合。
…
如果您还不太了解Java的整个集合体系的话,请查看《Java开发成长之路第一年》。如果您还想要了解线程的相关内容,请查看《Java多线程》。
线程不安全
java.util.HashMap、java.util.ArrayList、java.util.LinkedList、java.util.HashSet等集合实现类都是线程不安全的,在多线程环境下使用的话,将会得到无法预期的结果。
遍历不安全
java.util.Hashtable、java.util.Vector等集合类在多线程环境下,如果只是调用put、get、remove等方法的话是能保证线程安全的,但如果进行遍历的话就无法保证线程安全了。这种情况也叫做“条件线程安全”。
线程安全
java.util.concurrent.ConcurrentHashMap、java.util.concurrent.CopyOnWriteArrayList、java.util.concurrent.ConcurrentArraySet等是线程安全的。
Map
下面是验证HashMap问题的示例代码:
[codesyntax lang="java"]
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * java.util.HashMap的线程不安全测试,这里会有如下两种情况: *
- *
- 输出的Map元素个数不对 *
- 死循环(线程数多了更容易出现) *
* @author suren * @date 2017年2月22日 下午3:31:09 /public class HashMapTest{ static Map map; public static void main(String[] args) { map = new HashMap(); long begin = System.currentTimeMillis(); ThreadGroup group = new ThreadGroup("HashMap thread test from surenpi.com"); List threadList = new ArrayList(); int threadCount = 10; for(int i = 0; i < threadCount; i++) { Thread thread = new Thread(group, new Runnable() { @Override public void run() { for(int j = 0; j < 200 ; j++) { map.put(Thread.currentThread().getName() + j, ""); map.get(Thread.currentThread().getName() + j); } } }); threadList.add(thread); } for(Thread thread : threadList) { thread.start(); } while(group.activeCount() > 0) {} System.out.println(map.size()); System.out.println("take time : " + (System.currentTimeMillis() - begin)); }}
[/codesyntax]
以下是线程安全的Map实现类的效率比较示例:
[codesyntax lang="java"]
import java.util.ArrayList;import java.util.Hashtable;import java.util.List;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;/* * Hashtable和ConcurrentHashMap效率比较 * @author suren * @date 2017年2月22日 下午4:27:56 /public class ThreadSafeMapTest{ /* * @param args */ public static void main(String[] args) { mapTest(new Hashtable()); mapTest(new ConcurrentHashMap()); } static void mapTest(final Map map) { long begin = System.currentTimeMillis(); ThreadGroup group = new ThreadGroup("HashMap thread test from surenpi.com"); List threadList = new ArrayList(); int threadCount = 10; for(int i = 0; i < threadCount; i++) { Thread thread = new Thread(group, new Runnable() { @Override public void run() { for(int j = 0; j < 9999 ; j++) { map.put(Thread.currentThread().getName() + j, ""); map.get(Thread.currentThread().getName() + j); } } }); threadList.add(thread); } for(Thread thread : threadList) { thread.start(); } while(group.activeCount() > 0) {} System.out.println(map.getClass() + " take time : " + (System.currentTimeMillis() - begin)); }}
[/codesyntax]
List
下面是ArrayList和LinkedList线程不安全的示例代码:
[codesyntax lang="java"]
import java.util.ArrayList;import java.util.LinkedList;import java.util.List;/** * java.util.LinkedList和java.util.ArrayList的线程不安全测试,这里会有如下两种情况: *
- *
- ArrayList可能会出现下标越界的异常 *
- LinkedList的元素个数不正确 *
* @author suren * @date 2017年2月22日 下午3:31:09 */public class NonThreadSafeListTest{ public static void main(String[] args) { listTest(new LinkedList()); listTest(new ArrayList()); } static void listTest(final List list) { long begin = System.currentTimeMillis(); ThreadGroup group = new ThreadGroup("HashMap thread test from surenpi.com"); List threadList = new ArrayList(); int threadCount = 10; for(int i = 0; i < threadCount; i++) { Thread thread = new Thread(group, new Runnable() { @Override public void run() { for(int j = 0; j < 200 ; j++) { list.add(Thread.currentThread().getName() + j); } } }); threadList.add(thread); } for(Thread thread : threadList) { thread.start(); } while(group.activeCount() > 0) {} System.out.println(list.size()); System.out.println(list.getClass() + " take time : " + (System.currentTimeMillis() - begin)); }}
[/codesyntax]
java集合类的线程安全_Java集合中的线程安全问题相关推荐
- java集合类继承关系图_java集合继承关系图
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的,数组中可以存储基 ...
- java集合类的框架图_Java集合框架01-框架总览
本节摘要:从整体概述Java集合框架 一.Java集合框架架构图 Java集合框架是Java为开发者提供的工具类,集合框架被放置在 java.util.* 包下面,这些工具类从更高层面为开发者提供了数 ...
- java线程池最大线程数_Java项目中,线程池中线程数量太大会有什么影响?
1.线程栈是需要分配内存空间的,所以有数量上限 2.cpu切换线程涉及到上下文恢复,这个是需要耗费时间的,如果线程非常多而且切换频繁(处理IO密集任务),这个时间损耗是非常可观的. 线程池应该设置多大 ...
- 关于集合中的线程安全问题
仅供参考,如有错误,请指正! 集合中线程安全的类有:vector,stack,hashtable,enumeration,除此之外均是非线程安全的类与接口,简单记忆线程安全的集合类: 喂!SHE! ...
- Java哪些是线程安全的_Java集合中那些类是线程安全的
线程安全类 在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的.在jdk1.2之后,就出现许许多多非线程安全的类. 下面是这些线程安全的同步的类: vector:就比arraylist多 ...
- java 多线程池_Java项目中,线程池中线程数量太大会有什么影响?
简单说一下吧!拿我们生活中非常常见的一例子来说:并不是人多就能把事情做好,增加了沟通交流成本.你本来一件事情只需要3个人做,你硬是拉来了6个人,会提升做事效率嘛?我想并不会. 线程数量过多的影响也是和 ...
- java 集合工具类_Java集合中Collections工具类总结
Collections工具类 Collections 是一个操作 Collection(Set. List )和 Map 等集合的工具类 Collection和Collections的区别? Coll ...
- java list 博客园_Java集合系列(一)List集合
List的几种实现的区别与联系 List主要有ArrayList.LinkedList与Vector几种实现. ArrayList底层数据结构是数组, 增删慢.查询快; 线程不安全, 效率高; 不可以 ...
- java改变变量编码方式_Java 8中的5个功能将改变您的编码方式
java改变变量编码方式 Java 8在JVM和语言级别都包含了一些非常令人兴奋的功能. 尽管最初为该发行版设想的某些功能已扩展到第9版,或已推出第9版,但实际上有数十个新功能. 许多新添加的内容在编 ...
最新文章
- 使用各种方法加速大型矩阵运算的效率对比
- LinuxC高级编程——线程
- 论文笔记(Social Attentional Memory Network:Modeling Aspect- and Friend-level Differences in Recom-)
- poj 2705 Tangled in Cables 基础prim
- ie8 升级页面html,IE8怎么升级到IE11 IE浏览器怎么升级
- C#调用电脑的默认图片浏览器软件打开图片
- 搭建虚拟局域网云服务器,搭建虚拟局域网云服务器
- 【python】2022年618一起抢优惠券
- 【鸡汤】过往不恋,未来不迎,当下不杂
- html5 live,HTML5 live streaming
- win10电脑显示未连接网络连接到服务器,win10系统未识别网络无法连接到internet的解决方法...
- CSS 权威指南 CSS实战手册 第四版(阅读笔记)
- iPhone/iPad用iTunes“同步”不等于“备份”
- 利用大白菜制作多系统启动U盘(ubuntu+windows)
- java 生成根据图片内容生成图片包含格式有【png jepg GIF tiff wbmp】
- 微信小程序 - BILIBILI-demo
- 神经网络文本分类技术实践总结
- 曲面研究的两个基本问题、旋转曲面、柱面、二次曲面
- 选择排序-简单选择排序
- NET Framework合集
热门文章
- hfss和python_利用Python与HFSS联合仿真设计一个微带天线(附详细代码)
- [Tool] 常用开发工具注册码(持续更新)
- 【扫盲】女孩暗示你可以和她上床的十种表示【原创】
- excel导入mysql命令行_将Excel数据导入MySql
- 业务汇总报告PPT模板
- 金蝶erp与易飞erp区别_文化问题:敏捷和ERP第三部分
- LoRa技术特点和芯片总结
- Soot 静态分析框架(七)模块分析
- OpenCV3.3.0 + CLion + CMake 配置(Mac巨细无敌版)
- 基于FPGA的FIR数字滤波器设计