java各种集合的线程安全

转载自  java各种集合的线程安全

 

  1. 线程安全

首先要明白线程的工作原理,jvm有一个main memory,而每个线程有自己的working 
memory,一个线程对一个variable进行操作时,都要在自己的working 
memory里面建立一个copy,操作完之后再写入main 
memory。多个线程同时操作同一个variable,就可能会出现不可预知的结果。根据上面的解释,很容易想出相应的scenario。 
而用synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其他你认为合适的object比如method,然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完 
load到workingmemory -> use&assign -> store到mainmemory 
的过程,才会释放它得到的锁。这样就实现了所谓的线程安全。

什么是线程安全?线程安全是怎么完成的(原理)? 线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低依靠线程同步。

  1. java相关集合

  • Vector、ArrayList、LinkedList

Vector和ArrayList在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。  
 Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。  
 

  • ArrayList和LinkedList区别  

 

   对于处理一列数据项,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别。     从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能  
   而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。  
   如果在编程中,1,2两种情形交替出现,这时,你可以考虑使用List这样的通用接口,而不用关心具体的实现,在具体的情形下,它的性能由具体的实现来保证。    

 

  • HashTable,HashMap,HashSet

HashTable和HashMap采用相同的存储机制,二者的实现基本一致,不同的是:
1)、HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都是synchronized。
2)、HashTable不允许有null值的存在。

在HashTable中调用put方法时,如果key为null,直接抛出NullPointerException。其它细微的差别还有,比如初始化Entry数组的大小等等,但基本思想和HashMap一样。

 

HashSet:
1、HashSet基于HashMap实现,无容量限制。
2、HashSet是非线程安全的。 
3、HashSet不保证有序。 

HashMap:
1、HashMap采用数组方式存储key,value构成的Entry对象,无容量限制。
2、HashMap基于Key hash查找Entry对象存放到数组的位置,对于hash冲突采用链表的方式来解决。
3、HashMap在插入元素时可能会要扩大数组的容量,在扩大容量时须要重新计算hash,并复制对象到新的数组中。
4、HashMap是非线程安全的。
5、HashMap遍历使用的是Iterator 

HashTable
1、HashTable是线程安全的。
2、HashTable中无论是Key,还是Value都不允许为null。
3、HashTable遍历使用的是Enumeration。 


  • TreeSet,TreeMap

 TreeSet:
 1、TreeSet基于TreeMap实现,支持排序。
 2、TreeSet是非线程安全的。

    从对HashSet和TreeSet的描述来看,TreeSet和HashSet一样,也是完全基于Map来实现的,并且都不支持get(int)来获取指定位置的元素(需要遍历获取),另外TreeSet还提供了一些排序方面的支持。例如传入Comparator实现、descendingSet以及descendingIterator等。

TreeMap: 
1、TreeMap是一个典型的基于红黑树的Map实现,因此它要求一定要有Key比较的方法,要么传入Comparator实现,要么key对象实现Comparable接口。
2、TreeMap是非线程安全的。

 

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

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

相关文章

异步广度优先搜索算法

为什么要异步? CPU的工艺越来越小,Cannon Lake架构的Intel CPU已经达到10nm技术,因此在面积不变的情况下,核心数可以明显提升。单纯的提升主频将造成发热量大、需要的电压大、功耗大的问题。而传统的算法与数据结构是针对单核心单…

Servlet使用适配器模式进行增删改查案例(EmpServiceImpl.java)

/** * Title: EmpServiceImpl.java * Package org.service.impl * Description: TODO该方法的主要作用: * author A18ccms A18ccms_gmail_com * date 2017-9-10 下午8:33:06 * version V1.0 */ package org.service.impl;import java.util.List;import org.da…

Java读取properties配置文件时,中文乱码解决方法

转载自 关于java.util.Properties读取中文乱码的正确解决方案(不要再用native2ascii.exe了) 碰到了用java.util.Properties读取中文内容(UTF-8格式)的配置文件,发生中文乱码的现象, Properties propnew Pro…

jQuery 所有版本在线引用

https://www.cnblogs.com/xpwi/p/9806663.html jQuery 所有版本在线引用 jquery-3.1.1&#xff08;最新&#xff09; 官网jquery压缩版引用地址:<script src"https://code.jquery.com/jquery-3.1.1.min.js"></script> jquery-3.0.0 官网jquery压缩版…

Servlet使用适配器模式进行增删改查案例(jdbc.properties)

driveroracle.jdbc.driver.OracleDriver urljdbc\:oracle\:thin\:localhost\:1521\:orcl1 usernamescott password123

怎么用java实现通过身份证号码判断籍贯所在地区

https://blog.csdn.net/weixin_43876206/article/details/89426036 怎么用java实现通过身份证号码判断籍贯所在地区 java实现通过身份证号码判断籍贯所在地区 目标&#xff1a;用户输入自己的身份证号码&#xff0c;通过所输入的身份证号码来判断出用户的籍贯、所在地区。 功…

java-- properties总结

转载自 java-- properties总结 篇章一&#xff1a;Loading Properties from XML XML 属性文档具有以下 DOCTYPE 声明&#xff1a; <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 注意&#xff0c;导入或导出属性时不 访问系统 URI…

开箱即用 - jwt 无状态分布式授权

基于JWT(Json Web Token)的授权方式 JWT 是JSON风格轻量级的授权和身份认证规范&#xff0c;可实现无状态、分布式的Web应用授权&#xff1b; 从客户端请求服务器获取token&#xff0c; 用该token 去访问实现了jwt认证的web服务器。 token 可保存自定义信息&#xff0c;如用户基…

List VS Set

Duang Duang Duang面试官来啦&#xff0c;快坐好&#xff0c;摆好姿势。 好了&#xff0c;我要开始提问了&#xff1a; 问&#xff1a;Set集合与List集合有什么区别呢&#xff1f; 答&#xff1a;Set集合中的数据不可重复&#xff0c;数据是无序的&#xff0c;List集合的数据可…

外部访问docker容器(docker run -p/-P 指令) docker run -d -p 5000:5000 {hostPort:containerPort(映射所有接口地}

https://www.cnblogs.com/williamjie/p/9915019.html &#xff08;2&#xff09;-p&#xff08;小写&#xff09;则可以指定要映射的IP和端口&#xff0c;但是在一个指定端口上只可以绑定一个容器。支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::cont…

读取/书写Java的XML格式properties文件

转载自 读取/书写Java的XML格式properties文件 在JDK5中&#xff0c;properties文件的格式可以由XML构成&#xff0c;这里给出了一个读取/书写XML格式properties文件的例子。因为使用了XML&#xff0c;所以文件内容支持了CJKV(中文、日文、韩文、越南语)。可以直接书写、调用…

使用泛型前 VS 使用泛型后

不使用泛型&#xff1a; List list1 new ArrayList(); list1.add("www.educoder.net"); String str1 (String)list1.get(0);使用泛型&#xff1a; List<String> list2 new ArrayList<String>(); list2.add("www.educoder.net"); String s…

ssh报错java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to org.service.impl.EmpServi

错误如下&#xff1a; java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to org.service.impl.EmpServiceImpl at org.service.impl.EmpServiceImplTest.init(EmpServiceImplTest.java:44)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Metho…

去掉字符串后面所有的0 去掉字符串前面或后面的0;

https://blog.csdn.net/weixin_43844810/article/details/94577879 去掉字符串前面或后面的0&#xff1b; 养猫还是养狗&#xff1f; 2019-07-03 17:10:23 4492 收藏 1 分类专栏&#xff1a; 工作 版权 方法一&#xff1a; int a 0; //将油站编码前的0去掉 …

Java类加载器总结

转载自 Java类加载器总结 1.类的加载过程 JVM将类加载过程分为三个步骤&#xff1a;装载&#xff08;Load&#xff09;&#xff0c;链接&#xff08;Link&#xff09;和初始化(Initialize)链接又分为三个步骤&#xff0c;如下图所示&#xff1a; 1) 装载&#xff1a;查找并…

ssh根据姓名查询的时候报错java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!

错误如下&#xff1a; java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based! at org.hibernate.engine.query.ParameterMetadata.getOrdinalParameterDescriptor(ParameterMetadata.java:79)at org.hibernate.engine.query.ParameterMetadat…

拆分字符串

String.split()拆分字符串 lang包String类的split()方法 public String[] split(String regex) public String[] split(String regex&#xff0c;int limit) //limit 参数控制模式应用的次数&#xff0c;因此影响所得数组的长度 拆分示例:public class SplitDemo {public sta…

MyBatis-Plus EntityWrapper的使用 wrapper le ge

https://blog.csdn.net/shujuelin/article/details/99568651 MyBatis-Plus EntityWrapper的使用 脚丫先生 2019-08-14 14:43:43 2660 收藏 分类专栏&#xff1a; javaee 版权 调度Airflow 本专刊主要以调度系统Airflow详细讲解(会把工作中对于调度系统的docker容器化部署、…

又踩.NET Core的坑:在同步方法中调用异步方法Wait时发生死锁(deadlock)

之前在将 Memcached 客户端 EnyimMemcached 迁移 .NET Core 时被这个“坑”坑的刻骨铭心&#xff08;详见以下链接&#xff09;&#xff0c;当时以为只是在构造函数中调用异步方法&#xff08;注&#xff1a;这里的异步方法都是指基于Task的&#xff09;才会出线死锁&#xff0…