Java集合(实现类线程安全性)

转载自  Java集合(实现类线程安全性)

 

1、集合和Map

    下图是Java集合的Collection集合体系的继承树:

    下图是Java的Map体系的继承树:

 

    对于Set、List、Queue和Map四种集合,最常用的是HashSet、TreeSet、ArrayList、ArrayQueue、LinkedList和HashMap、TreeMap等实现类。

    其中Vector、HashTable、Properties是线程安全的。其中ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。(线程不安全是指:当多个线程访问同一个集合或Map时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。)

 

2、包装线程不安全的集合

    当多个并发向这些集合中存、取元素时,就可能会破坏这些集合的数据完整性。

    如果程序中有多个线程可能访问以上这些集合,就可以使用Collections提供的类方法把这些集合包装成线程安全的集合。Collections提供了如下几个静态方法。

  • <T> Collection<T> synchronizedCollection(Collection<T> c): 返回指定collection 对应的线程安全的collection。
  • static <T> List<T> synchronizedList(List<T> list): 返回指定List对象对应的线程安全的List 对象。
  • static <K, V> Map<K, V> synchronizedMap(Map<K, V> m): 返回指定Map对象对应的线程安全的Map对象。
  • static <T> Set<T> synchronizedSet(Set<T> s): 返回指定Set对象对应的线程安全的Set对象。
  • static <K, V> SortedMap<K, V> synchronizedSortedMap(SortedMap<K, V> m): 返回指定SortedMap对象对应的线程安全的SortedMap对象。
  • static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s): 返回指定SortedSet对象对应的线程安全的SortedSet对象。

    例如需要在多线程里使用线程安全的HashMap对象(如果需要把某个集合包装成线程安全的集合,则应该在创建之后立即包装,如下程序所示),则可以采用如下代码:

    // 使用Collections 的 synchronizedMap 方法将一个普通的HashMap包装成线程安全的类

    HashMap m = Collections.synchronizedMap(new HashMap());

 

3、线程安全的集合类

    从Java 5 开始,在java.util.concurrent 包下提供了大量支持高效并发访问的集合接口和实现类,如下图所示:

 

    从上图中所示的类图可以看出,这些线程安全的集合类可以分为如下两类。

  • 以Concurrent 开头的集合类,如ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentLinkedQueue 和 ConcurrentLinkedDeque。
  • 以CopyOnWrite 开头的集合类,如CopyOnWriteArrayList、CopyOnWriteArraySet。

    其中以Concurrent 开头的集合类代表了支持并发访问的集合,它们可以支持多个线程并发写入访问,这些写入线程的所有操作都是线程安全的,但读取操作不必锁定。以Concurrent 开头的集合类采用了更复杂的算法来保证永远不会锁住整个集合,因此在并发写入时有较好的性能。

    当多个线程共享访问一个公共集合时,ConcurrentLinkedQueue 是一个恰当的选择。ConcurrentLinkedQueue集合时无需等待。

    在默认情况下,ConcurrentHashMap 支持16个线程并发写入,当有超过16 个线程并发向该Map 中写入数据时,可能有一些线程需要等待。实际上,程序通过设置concurrentLevel 构造参数(默认值为16)来支持更多的并发写入线程。

    与前面介绍的HashMap 和普通集合不同的是,因为ConcurrentLinkedQueue 和 ConcurrenthashMap 支持多线程并发访问,所以当使用迭代来遍历集合时,该迭代器可能不能反映出创建迭代器之后所做的修改,但程序不会抛出任何异常。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot 页面下载文件 网页下载文件功能 文件放resourcce下面

SpringMVC(Springboot)返回文件方法 zhao1949 2018-10-25 09:47:13 6866 收藏 1 https://blog.csdn.net/Lynn_coder/article/details/79953977 ********************************************************* 项目需要生成excel表格&#xff0c;然后返回给用户&#xff0c;用…

开源软件那么多,我们该如何选择?|洞见

当我们说起开源软件的时候&#xff0c;想必大家都有丰富的使用经历&#xff0c;小到Node.js的一个组件库&#xff0c;大到一套办公软件如LibreOffice&#xff0c;再如Linux操作系统&#xff0c;可以说无奇不有&#xff0c;浩如烟海。就拿我们常用的Github来说&#xff0c;官方的…

Java 集合框架分析:线程安全的集合

转载自 Java 集合框架分析:线程安全的集合 相关文章&#xff1a; Java 集合框架分析:Set http://blog.csdn.net/youyou1543724847/article/details/52733723 Java 集合框架分析:LinkedList http://blog.csdn.net/youyou1543724847/article/details/52734935 Java 集合框架分…

如何使用计算机远程关闭手机软件,如何使用手机远程遥控电脑关机?手机遥控电脑关机方法图文介绍...

电脑定时关机很正常&#xff0c;但是你试过手机遥控电脑关机吗&#xff1f;或许你有时候很懒&#xff0c;相关电脑如何通过手机遥控关机。现在已经可以实现&#xff0c;简单就可以遥控电脑关机。一个屌丝般的软件&#xff0c;高富帅般的技术&#xff0c;下边详细介绍一下如何使…

MyBatisPlus(笔记)

简介 学习MyBatis-Plus之前要先学MyBatis–>Spring—>SpringMVC 为什么要学它?MyBatisPlus可以节省我们大量的时间,所有CRUD代码都可以自动完成 JPA, tk-mapper ,MyBatisPlus 偷懒用的! 是什么? 官网:https://baomidou.com/ 特性 无侵入&#xff1a;只做增强不做…

WebAPi的可视化输出模式(RabbitMQ、消息补偿相关)——所有webapi似乎都缺失的一个功能

最近的工作我在做一个有关于消息发送和接受封装工作。大概流程是这样的&#xff0c;消息中间件是采用rabbitmq&#xff0c;为了保证消息的绝对无丢失&#xff0c;我们需要在发送和接受前对消息进行DB落地。在发送前我会先进行DB的插入&#xff0c;单表插入&#xff0c;所以在性…

java实现遍历树形菜单方法——Dao层

Dao层接口&#xff1a;/** * Title: IVoteTreeDao.java * Package org.dao * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-5-6 下午10:38:47 * version V1.0 */ package org.dao;import java.util.List;import org.e…

文件损坏 无法删除 怎么使用chkdsk磁盘修复工具

有时候我们会遇到文件无法删除的问题&#xff0c;该如何解决。对于专业人士可能比较简单。对于小白&#xff0c;就够折腾人的了。下面分享下我是怎么做的。 很简单很实用。 现象&#xff1a;此时哪里有损坏&#xff0c;一般会在删除文件时&#xff0c;莫名的提示有文件无法删除…

35c3 krautflare

参考这篇文章可以彻底了解本题的漏洞所在 https://xz.aliyun.com/t/6527 由于Math.expm1经过patch以后的返回值不可能是-0&#xff0c;但是patch的地方是在typer优化中&#xff0c;所以实际上如果没有优化的话是可以返回-0的&#xff0c;这就意味着如果我们先不停地Math.expm1…

Java集合框架综述

转载自 Java集合框架综述 集合框架&#xff08;collections framework&#xff09; 首先要明确&#xff0c;集合代表了一组对象&#xff08;和数组一样&#xff0c;但数组长度不能变&#xff0c;而集合能&#xff09;。Java中的集合框架定义了一套规范&#xff0c;用来表示、…

vue项目没有启动成功的原因之一

删除mould。。。本地从新安装

RabbitMQ 高可用集群搭建及电商平台使用经验总结

面向EDA&#xff08;事件驱动架构&#xff09;的方式来设计你的消息AMQP routing key的设计RabbitMQ cluster搭建Mirror queue policy设置两个不错的RabbitMQ plugin 大型应用插件(Sharding、Rederation)Queue镜像失败手动同步各集群配置同步方式&#xff08;RabbitMQ export\i…

谷歌浏览器如何阻止弹窗广告?右下角弹窗一个接一个的弹出 每隔几分钟又来一波 怎么屏蔽?

谷歌浏览器如何阻止弹窗广告&#xff1f;右下角弹窗一个接一个的弹出 每隔几分钟又来一波 怎么屏蔽&#xff1f; 作者&#xff1a;知乎用户 链接&#xff1a;https://www.zhihu.com/question/319190736/answer/645314963 来源&#xff1a;知乎 著作权归作者所有。商业转载请联…

如何线程安全的使用HashMap

转载自 如何线程安全的使用HashMap 在周二面试时&#xff0c;一面的面试官有问到 HashMap 是否是线程安全的&#xff0c;如何在线程安全的前提下使用 HashMap,其实也就是 HashMap&#xff0c;Hashtable&#xff0c;ConcurrentHashMap 和 synchronized Map 的原理和区别。当时有…

用.net core 写后端—— c++外的另一种选择?

一、.net core简介 &#xff08;1&#xff09;.net是什么 .net实际是遵守同一个标准&#xff08;ECMA&#xff09;的多种不同实现&#xff0c;如.net Framework、Mono、和较新的.netcore。C#是.net支持的其中一种语言&#xff0c;理论上任何遵循公共语言规范&#xff08;CLS&am…

《微软开源跨平台移动开发实践》团购通知

【新书推荐】《微软开源跨平台移动开发实践》带你走近微软开源开源跨平台技术 大家的响应非常积极&#xff0c;接近400位同学想团购。 这两天通过作者李争的努力&#xff0c;为大家争取到了非常实惠的价格&#xff0c;投票结果看不到具体是谁参与了投票&#xff0c;请参与投票的…

Invalid character found in the request target. The valid characters are defi

解决Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 问题 ApiOperation(value "根据排污口类型获取所有企业排污口信息和经度和纬度", notes "获取所有企业排污口信息和经度和纬度") PostMappin…

大咖微课 | 直面Angular2系列课第二期开讲

1.背景介绍&#xff1a;Angular1.x与Angular2 近年来&#xff0c;Web 开发技术的发展日新月异&#xff0c;各种框架层出不穷。在这样的大背景之下&#xff0c;2010年10月&#xff0c;Google 首次发布了自己的 Web 开发框架&#xff0c;名为 AngularJS&#xff0c;也叫 Angular&…

HashMap在java并发中如何发生死循环

转载自 HashMap在java并发中如何发生死循环 在多线程环境中&#xff0c;使用HashMap进行put操作时会引起死循环&#xff0c;导致CPU使用接近100%&#xff0c;下面通过代码分析一下为什么会发生死循环。 首先先分析一下HashMap的数据结构&#xff1a;HashMap底层数据结构是有一…