介绍

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集合中的线程安全问题相关推荐

  1. java集合类继承关系图_java集合继承关系图

    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的,数组中可以存储基 ...

  2. java集合类的框架图_Java集合框架01-框架总览

    本节摘要:从整体概述Java集合框架 一.Java集合框架架构图 Java集合框架是Java为开发者提供的工具类,集合框架被放置在 java.util.* 包下面,这些工具类从更高层面为开发者提供了数 ...

  3. java线程池最大线程数_Java项目中,线程池中线程数量太大会有什么影响?

    1.线程栈是需要分配内存空间的,所以有数量上限 2.cpu切换线程涉及到上下文恢复,这个是需要耗费时间的,如果线程非常多而且切换频繁(处理IO密集任务),这个时间损耗是非常可观的. 线程池应该设置多大 ...

  4. 关于集合中的线程安全问题

    仅供参考,如有错误,请指正! 集合中线程安全的类有:vector,stack,hashtable,enumeration,除此之外均是非线程安全的类与接口,简单记忆线程安全的集合类: 喂!SHE!   ...

  5. Java哪些是线程安全的_Java集合中那些类是线程安全的

    线程安全类 在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的.在jdk1.2之后,就出现许许多多非线程安全的类. 下面是这些线程安全的同步的类: vector:就比arraylist多 ...

  6. java 多线程池_Java项目中,线程池中线程数量太大会有什么影响?

    简单说一下吧!拿我们生活中非常常见的一例子来说:并不是人多就能把事情做好,增加了沟通交流成本.你本来一件事情只需要3个人做,你硬是拉来了6个人,会提升做事效率嘛?我想并不会. 线程数量过多的影响也是和 ...

  7. java 集合工具类_Java集合中Collections工具类总结

    Collections工具类 Collections 是一个操作 Collection(Set. List )和 Map 等集合的工具类 Collection和Collections的区别? Coll ...

  8. java list 博客园_Java集合系列(一)List集合

    List的几种实现的区别与联系 List主要有ArrayList.LinkedList与Vector几种实现. ArrayList底层数据结构是数组, 增删慢.查询快; 线程不安全, 效率高; 不可以 ...

  9. java改变变量编码方式_Java 8中的5个功能将改变您的编码方式

    java改变变量编码方式 Java 8在JVM和语言级别都包含了一些非常令人兴奋的功能. 尽管最初为该发行版设想的某些功能已扩展到第9版,或已推出第9版,但实际上有数十个新功能. 许多新添加的内容在编 ...

最新文章

  1. 使用各种方法加速大型矩阵运算的效率对比
  2. LinuxC高级编程——线程
  3. 论文笔记(Social Attentional Memory Network:Modeling Aspect- and Friend-level Differences in Recom-)
  4. poj 2705 Tangled in Cables 基础prim
  5. ie8 升级页面html,IE8怎么升级到IE11 IE浏览器怎么升级
  6. C#调用电脑的默认图片浏览器软件打开图片
  7. 搭建虚拟局域网云服务器,搭建虚拟局域网云服务器
  8. 【python】2022年618一起抢优惠券
  9. 【鸡汤】过往不恋,未来不迎,当下不杂
  10. html5 live,HTML5 live streaming
  11. win10电脑显示未连接网络连接到服务器,win10系统未识别网络无法连接到internet的解决方法...
  12. CSS 权威指南 CSS实战手册 第四版(阅读笔记)
  13. iPhone/iPad用iTunes“同步”不等于“备份”
  14. 利用大白菜制作多系统启动U盘(ubuntu+windows)
  15. java 生成根据图片内容生成图片包含格式有【png jepg GIF tiff wbmp】
  16. 微信小程序 - BILIBILI-demo
  17. 神经网络文本分类技术实践总结
  18. 曲面研究的两个基本问题、旋转曲面、柱面、二次曲面
  19. 选择排序-简单选择排序
  20. NET Framework合集

热门文章

  1. hfss和python_利用Python与HFSS联合仿真设计一个微带天线(附详细代码)
  2. [Tool] 常用开发工具注册码(持续更新)
  3. 【扫盲】女孩暗示你可以和她上床的十种表示【原创】
  4. excel导入mysql命令行_将Excel数据导入MySql
  5. 业务汇总报告PPT模板
  6. 金蝶erp与易飞erp区别_文化问题:敏捷和ERP第三部分
  7. LoRa技术特点和芯片总结
  8. Soot 静态分析框架(七)模块分析
  9. OpenCV3.3.0 + CLion + CMake 配置(Mac巨细无敌版)
  10. 基于FPGA的FIR数字滤波器设计