`
ray_yui
  • 浏览: 216714 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

并发编程 — 并发数据结构

    博客分类:
  • Java
阅读更多

并发编程系列文章:
      初解线程池:http://ray-yui.iteye.com/blog/2072463
      详解线程池:http://ray-yui.iteye.com/blog/2075311
      并发数据类型:http://ray-yui.iteye.com/blog/2080454
      并发数据结构:http://ray-yui.iteye.com/blog/2084202
      volatile:http://ray-yui.iteye.com/blog/2231474
      判断线程安全:http://ray-yui.iteye.com/blog/2232931
      实现线程安全:http://ray-yui.iteye.com/blog/2234688


      由于并行程序与串行程序的不同特点,适用于串行程序当中的常用数据结构在并发环境中会引发线程安全问题,例如ArrayList,HashSet,HashMap等,这是因为这些数据结构不是线程安全的,所以编写并行程序时需要将原串行数据结构转换为线程安全或使用对并行程序效率更高的并行数据结构


      使传统集合更改为线程安全集合

      public class TestMain {
    @Test
    public void testTraditionCollections() throws Exception {

        // Collections中提供多种方法将集合变成线程安全

        // 转换ArrayList
        Collections.synchronizedList(new ArrayList<Object>());

        // 转换HashMap
        Collections.synchronizedMap(new HashMap<Object, Object>());

        // 转换HashSet
        Collections.synchronizedSet(new HashSet<Object>());
    }
}


并发List
      VectorCopyOnWriteArrayList是两个线程安全的List实现,而VectorCopyOnWriteArrayList的内部实现又有所不同,Vector使用锁机制实现线程安全,在多线程世界中锁是并发的最大敌人,太多的锁竞争会消耗系统资源和降低并发,而CopyOnWriteArrayList实现并不使用锁,而是使用了对象的不变性,在对象读取时不需要加锁,而是在试图改变对象时,先获取对象的一个copy,对copy进行修改后将副本回写,减少了锁竞争提高了并发时的读取性能,但某程度上牺牲了写的性能,当写操作频繁时请选择Vector,当高并发读取时,应该选择CopyOnWriteArrayList



并发Set
      对比上述并发List,Set当中亦存在CopyOnWriteArraySet,对应并发List当中的CopyOnWriteArrayList,而Vector对应使用Collections.synchronizedSet后的Set



并发Map
      在并发环境中使用Collections.synchronizedMap可以获取线程安全的Map,或HashTable,但JDK提供了另一种并发ConcurrentHashMap,ConcurrentHashMap的读写速度比同步Map速度更快,ConcurrentHashMap如此高效得益于它的get操作是无锁的,而put操作锁的粒度比同步的Map小,在高并发环境中务必优先选择ConcurrentHashMap



并发Queue
      在并发Queue中提供了两套具有代表性的实现,分别是高性能的ConcurrentLinkedQueueBlockingQueue,ConcurrentLinkedQueue适用于高并发的读写,它通过无锁的方式实现高性能,BlockingQueue的主要功能并不是体现在提升并发时队列的性能,而在于简化多线程之间的数据共享,阻塞队列在生产者-消费者模式中得到了完美的体现,BlockingQueue提供了3种存取方式,请读者参考JDK文档

      PS:BlockingQueueArrayBlockingQueueLinkedBlockingQueue两个实现类,相信读者已熟悉ArrayLinked的区别,此乃经典面试题,笔者在此不再叙述



并发Deque
      Deque是基于链接点的阻塞栓双端队列,Deque允许在队列的头部或者尾部进行读写,LinkedList也实现了Deque接口,DequeQueue一样提供了3种元素的存取方式,甚至提供了指读取不删除的操作方式,详情请读者查看JDK帮助文档,但LinkedBlockingDeque并没有进行读写锁分离,因此在效率方面要低于LinkedBlockingQueue更远低于ConcurrentLinkedQueue


总结:
      软件中数据结构博大精深,但万变不离经典,除了要熟练使用传统串行数据结构外,还需要对并发的数据结构有所认识和了解,特别在开发并行程序时需要格外注意,否则将出现非常难以重现的错误,在并发数据结构中还有Apache下的Amino框架,Amino框架提供更快速实现CAS算法的数据结构,详情请留意笔者后续文章
19
2
分享到:
评论
8 楼 dongya1987 2014-06-27  
ComcurrentHashMap -> ConcurrentHashMap
7 楼 lz958942 2014-06-26  
不错的文章
6 楼 jeve 2014-06-25  
标记下要看的
5 楼 jeve 2014-06-25  
标记下,要看的
4 楼 hunanlzg 2014-06-25  
markkkk
3 楼 arsemilan 2014-06-24  
不错。markkkkkkkkkkkkkkkkkkkkk
2 楼 ray_yui 2014-06-24  
uniqueQ 写道
支持楼主,看得出楼主文章都是原创手写,精神值得支持,注意错别字

感谢支持!
1 楼 uniqueQ 2014-06-24  
支持楼主,看得出楼主文章都是原创手写,精神值得支持,注意错别字

相关推荐

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │ 高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │ 高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续....

    Java并发编程实战

    第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1 串行地执行任务 6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 ...

    Windows并发编程指南高清pdf版

    本书详细讲述Windows并发编程的相关知识。内容分为四个部分:第一部分“概念”从高层视角介绍并发的基本概念,为读者理解并发打下基础:第二部分“机制”重点介绍了一些基础的功能、内部工作机制以及各种APl等;第三...

    Windows并发编程指南pdf

    本书详细讲述Windows并发编程的相关知识。内容分为四个部分:第一部分“概念”从高层视角介绍并发的基本概念,为读者理解并发打下基础:第二部分“机制”重点介绍了一些基础的功能、内部工作机制以及各种APl等;第三...

    多线程并发编程-同步与互斥-原⼦变量-并发和⽆锁 数据结构

    多线程并发编程-同步与互斥-原⼦变量-并发和⽆锁 数据结构

    Windows并发编程指南(1) 高清中文版

    本书详细讲述Windows并发编程的相关知识。内容分为四个部分:第一部分“概念”从高层视角介绍并发的基本概念,为读者理解并发打下基础:第二部分“机制”重点介绍了一些基础的功能、内部工作机制以及各种APl等;第三...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │ 高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │ 高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续....

    并发多数据与多核编程课程课程作业

    (1).TicketingDS.java文件,TicketingDS类是实现并发数据结构的类。 1⃣️方法:TicketingDS(int routenum, int coachnum, int seatnum, int stationnum, int threadnum),初始化方法,用来初始化并发数据结构和变量...

    Java 并发编程实战

    第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1 串行地执行任务 6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 ...

    并发编程笔记20190526.docx

    2、ConcurrentHashMap中的数据结构 47 3、ConcurrentHashMap初始化 48 4、ConcurrentHashMap的操作 51 二、JDK1.8中原理和实现 54 1、ConcurrentHashMap的数据结构 54 2、ConcurrentHashMap的初始化 55 3、Node链表...

    Go并发编程实战+第2版_Lite.pdf_golang_

    本书首先介绍了Go语言的优秀特性、安装设置方法、工程结构、标准命令和工具、语法基础、数据类型以及流程控制方法,接着阐述了与多进程编程和多线程编程有关的知识,然后重点介绍了goroutine、channel以及Go提供的...

    Go并发编程研讨课.pdf

    深入Go并发编程研讨课 Go提供了我们便利的进行并发...atomic可以保证对数据操作的一致性,利用CAS可以设计lock-free的数据结构 channel是Go语言进行并发编程的很好的工具,带你了解它的使用姿势 了解Go语言的内存模型

    java并发编程实战、驾校K1考试试卷批量生成mysql表结构和数据

    java并发编程实战、驾校K1考试试卷批量生成mysql表结构和数据

    Python高级软件开发技术(数据结构,Linux,网络并发编程,RE模块,MySQL).zip

    深度学习教学视频: Python高级软件开发技术(数据结构,Linux,网络并发编程,RE模块,MySQL)

    并发数据结构与多核编程-大作业-完整代码-三套

    分享自己整理和改进过的编程作业代码,有用的话,欢迎点赞收藏。 中国科学院大学,并发数据结构与多核编程_大作业,列车售票系统。

    并发数据结构与多核编程英文版

    Written by MauriceHerlihy and NirShavit , including Mutual Exclusion,Concurrent Objects , Foundations of Shared Memory etc .

    微服务架构面试专题系列(MySQL,JVM,并发编程,RabbitMQ消息中间件,Spring)

    300M资源,微服务架构面试专题系列(MySQL,JVM,并发编程,RabbitMQ消息中间件,Spring)。 囊括的知识点非常多 1. Java基础包括了:集合,HashMap,JVM等常见考点, 说一下 JVM 的主要组成部分及其作用? 说一下 ...

    Rust Series,语法基础、数据结构、并发编程、工程实践,常见的代码示例 &amp; 数据结构与算法.zip

    大数据算法在数据分析中发挥着重要的作用,它可以提高分析工作的效率和准确性,为决策提供有力支持。具体来说,大数据算法可以分类、聚类、预测和关联规则分析等,从而发现数据之间的规律和关联关系,挖掘出潜在的...

    并发数据结构与多核编程21-22秋季1

    第1节引言第2节 集合和链表第3节 并发推理第4节 细粒度锁第5节 乐观锁第6节 惰性链表第7节 无锁链表第8节 性能分析和比较第九章 并发队列和并发栈 3学时

Global site tag (gtag.js) - Google Analytics