`
ray_yui
  • 浏览: 220246 次
  • 性别: 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  
支持楼主,看得出楼主文章都是原创手写,精神值得支持,注意错别字

相关推荐

    C++并发编程实践 C++ Concurrency in Action

    第六章讨论了如何设计基于锁的并发数据结构,这类数据结构通常使用互斥量来保护共享数据。 - **栈和队列**:介绍了一些常见的基于锁的并发数据结构,如线程安全的栈和队列。 - **哈希表**:讨论了如何实现线程安全...

    深入理解并发编程

    为了解决这些问题,程序员可以采取一些措施,比如使用同步原语、设计合理的并行算法、使用并发数据结构和库、以及利用现代编程语言和编译器提供的并发抽象。 在实际编程中,了解并发编程的原理和难点对于编写高效、...

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    此外,书中还介绍了Java并发容器,如ConcurrentHashMap、CopyOnWriteArrayList和BlockingQueue等,这些都是为并发环境设计的高效数据结构。它们在多线程环境下的性能和线程安全特性使得开发者能更方便地实现并发操作...

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

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

    Java 并发编程实战.pdf

    - **并发数据处理**:利用Stream API结合并行流处理大量数据集,提高数据处理效率。 通过上述内容的学习,开发者不仅能掌握Java并发编程的基本原理和技术要点,还能学会如何将这些理论应用于实际工作中,解决复杂的...

    Windows并发编程指南高清pdf版

    同时,本部分也探讨了并发编程中使用到的各种数据结构,例如线程安全的队列、字典等,以及如何选择合适的算法以适应并发环境,如在并行环境下提高排序、搜索等操作的效率。这些内容为读者提供了编写高效并发程序的...

    java并发编程与实践

    8. **并发编程的最佳实践**:包括避免过度同步、正确使用线程安全组件、避免阻塞操作以及合理设计并发结构等。 通过深入学习"Java并发编程与实践"文档,开发者能够提升自己在高并发环境下的编程能力,设计出更加...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...

    C++ 并发编程中文版

    传统的并发数据结构设计往往依赖于锁,而无锁数据结构则通过使用原子操作来实现线程安全,它们各有优劣。书中会对比这两种设计方法,并提供一些实用的设计模式。 在并发编程中,代码的设计至关重要。书中的“并发...

    Python高级编程和异步IO并发编程

    本资源"Python高级编程和异步IO并发编程"旨在深入探讨这些主题,帮助开发者提升技能,以实现更高效、更强大的程序设计。 首先,让我们从面向对象编程(OOP)开始。在Python中,OOP是一种强大的设计模式,它允许我们...

    Java并发编程设计原则和模式

    在Java编程领域,并发编程是一项核心技能,尤其是在多核处理器和分布式系统中,它能显著提升应用程序的性能和响应速度。本资料“Java并发编程设计原则和模式”深入探讨了如何在Java环境中有效地进行并发处理,以充分...

    Java并发编程实践.pdf

    例如,可以通过分解任务、优化数据结构等方式减少锁的竞争。 ##### 4.2 使用线程本地变量 对于不需要共享的数据,可以考虑使用ThreadLocal来存储线程私有的副本,这样可以避免不必要的线程间通信和同步操作。 ####...

    JAVA并发编程实践

    《JAVA并发编程实践》是Java开发者深入理解和应用并发编程的重要参考书籍,由Doug Lea等专家撰写,书中全面探讨了Java平台上的并发编程技术。在Java世界中,并发编程是提高程序性能和效率的关键手段,尤其在多核...

    java并发编程艺术

    5. **线程安全的数据结构**:介绍Java中线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等,以及它们在并发编程中的应用。 6. **线程间的通信**:讲解wait()、notify()和...

    go并发编程实践V2+源代码

    Go语言通过goroutines和channels这两大数据结构实现了轻量级线程和进程间的通信,使得并发编程变得简单且高效。 1. **Goroutines**:Goroutines可以看作是Go语言中的轻量级线程,它们的创建和销毁开销很小,且由Go...

    Java并发编程实战

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

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

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

    java虚拟机并发编程.pdf

    3. **并发集合**:Java并发集合库提供了一组线程安全的数据结构,如ConcurrentHashMap、CopyOnWriteArrayList等,这些集合能够在多线程环境下保持高效性能。 4. **原子操作与CAS**:Atomic类库中的原子变量支持无锁...

Global site tag (gtag.js) - Google Analytics