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;用…

java实现遍历树形菜单方法——实体类VoteTree

package org.entity;import java.util.ArrayList; import java.util.List;/*** * * 项目名称&#xff1a;testTree * 类名称&#xff1a;VoteTree * 类描述&#xff1a; 树形菜单实体类 * 创建人&#xff1a;Mu Xiongxiong * 创建时间&#xff1a;2017-5-23 下午…

idea报错 电脑死机蓝屏

1.删除.idea 2.Maven路径不要在D盘 3.重启idea

在html页面中怎么打印区域,在HTML中指定打印区域进行打印机打印

我们在开发中经常会用到一些指定区域进行打印机打印&#xff0c;但是使用常规方式打印会将全部页面打印&#xff0c;当然相同都为打印&#xff0c;但是打印出来的内容并不是我们需要的东西&#xff0c;进行给大家分享如何设置打印机指定区域进行打印&#xff1b;该标签中的内容…

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

当我们说起开源软件的时候&#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 集合框架分…

java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml

<?xml version"1.0" encoding"utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file au…

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

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

MyBatisPlus(笔记)

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

Java多线程:线程安全和非线程安全的集合对象

转载自 Java多线程&#xff1a;线程安全和非线程安全的集合对象 一、概念&#xff1a; 线程安全&#xff1a;就是当多线程访问时&#xff0c;采用了加锁的机制&#xff1b;即当一个线程访问该类的某个数据时&#xff0c;会对这个数据进行保护&#xff0c;其他线程不能对其访问…

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;莫名的提示有文件无法删除…

计算机网络产生的历史背景,网络技术背景及sdn概述.pdf

网络技术背景及sdn概述软件定义网络黄韬北京邮电大学北京邮电大学第1章&#xff1a;背景与概述个人简介个人简介• 黄韬– 信息与通信工程学院– 博士&#xff0c;副教授– 科研方向科研方向&#xff1a;&#xff1a;未来网络未来网络– 教学课程&#xff1a;计算机网络、软件定…

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…

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

Service接口&#xff1a; /** * Title: IVoteTreeService.java * Package org.Service * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-5-6 下午10:42:10 * version V1.0 */ package org.Service;import java.util.Li…