Javacurrent并发包超详细分析.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

Javacurrent并发包超详细分析

目录并发包ConcurrentHashMapCountDownLatch倒计数触发CyclicBarrier循环屏障Semaphore指示灯Exchanger交换者

并发包

current并发包、在JDK1.5之前Java并没有提供线程安全的一些工具类去操作多线程,需要开发人员自行编写实现线程安全,但仍然无法完全避免低性能、死锁、资源管理等问题。在JDK1.5时新增了java.util.current并发包,其中提供了许多供我们使用的并发编程工具类。本文对于典型的并发包做出讲解

ConcurrentHashMap

Java集合框架提供了存储容器HashMap用于存储键值对,但是HashMap是线程不安全的。在并发编程中,我们向HashMap添加大量数据时,可能会出现各种预料之外的问题。

同时Java也提供了线程安全的集合类HashTable,打开HashTable的底层我们会发现HashTable的所有方法都利用synchtonized进行了上锁机制来保证了线程安全,但是利用这种阻塞同步的机制来保证线程安全的同时会大大降低程序的性能和执行效率,这也是为什么HashTable被淘汰的原因

在JDK1.5之后Java就提供了保证性能高效、线程安全的键值对存储容器ConcurrentHashMap

下面我们看下HashMap、HashTable、ConcurrentHashMap的对比

publicclassDemo01{

//publicstaticMapString,Stringmaps=newHashMapString,String

//publicstaticMapString,Stringmaps=newHashtableString,String

publicstaticMapString,Stringmaps=newConcurrentHashMapString,String

publicstaticvoidmain(String[]args)throwsException{

Runnabletask=newTemp();

Threadt1=newThread(task,A线程);

Threadt2=newThread(task,B线程);

t1.start();

t2.start();

//保证t1和t2先执行完

t1.join();

t2.join();

System.out.println(最终集合长度:+maps.size());

classTempimplementsRunnable{

@Override

publicvoidrun(){

for(inti=0;i500000;i++){

Demo01.maps.put(Thread.currentThread().getName()+i,Thread.currentThread().getName()+i);

如上述代码所示,我们启动两条线程执行同一任务:向容器中添加50万条数据,预期最终容器中的数据将会达到100万条。

利用HashMap存储时,发现程序会出现各种各样的异常状况

程序卡顿,不报异常也不停止

报异常

java.lang.ClassCastException:java.util.HashMap$Nodecannotbecasttojava.util.HashMap$TreeNode

最终产生错误数据

利用HashTable存储时,发现HashTable可以准确存储。并且对比HashTable和ConcurrentHashMap两者的存储速度,发现大差小不差甚至HashTable还要更快。那么为什么还要说HashTable效率低下呢?

是因为我们只是测试了对数据进行的写操作,而没有测试其他的像查询、修改等操作。综合来讲ConcurrentHashMap的各项性能优于HashTbale,所以我们在需要考虑线程安全时,就可以采用ConcurrentHashMap进行存储数据

那么ConcurrentHashMap是如何既保证线程安全又不失高性能的存储数据呢?

首先明确它的底层实现机制是用CAS机制+synchronized分段式锁,属于是悲观和乐观相结合

HashTable工作时会将整个哈希表进行上锁,此时所有其他线程都将

文档评论(0)

152****4498 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档