并发编程 — 并发数据结构

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

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

Java代码  

  1. public class TestMain {
  2. @Test
  3. public void testTraditionCollections() throws Exception {
  4. // Collections中提供多种方法将集合变成线程安全
  5. // 转换ArrayList
  6. Collections.synchronizedList(new ArrayList<Object>());
  7. // 转换HashMap
  8. Collections.synchronizedMap(new HashMap<Object, Object>());
  9. // 转换HashSet
  10. Collections.synchronizedSet(new HashSet<Object>());
  11. }

并发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算法的数据结构,详情请留意笔者后续文章

时间: 2024-10-09 20:03:55

并发编程 — 并发数据结构的相关文章

[并发编程]并发编程第二篇:利用并发编程,实现计算大量数据的和

利用并发编程,实现计算大量数据的和 实现代码: package tj.pojo.generate.main; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.u

并发编程 — 并发数据类型

在并行环境中,同步(锁)操作是实现真正并行的最大敌人,而且大量的锁竞争严重消耗了系统资源,但在开发当中不能避免多条线程对共享变量的修改,JDK1.5后为我们提供了一组实现了无锁算法(CAS算法)的类,他们分别包装了Integer,Long,Boolean和Integer,Long对应的数组类型 AtomicInteger(Long)核心方法: public final int get() 获取当前值    public final void set(int newValue) 设置当前值   

JAVA并发编程&gt;&gt;并发级别

理解并发 这是我在开发者头条看到的.@编程原理林振华 有目标的提升自己会事半功倍,前行的道路并不孤独. 1.阻塞 当一个线程进入临界区(公共资源区)后,其他线程必须在临界区外等待,待进去的线程执行完成任务离开临界去后,其它线程才能进去. 2.无饥饿 线程排队先来后到,不管优先级大小,先来先执行,,就不会产生饥饿等待资源,也即公平锁:相反非公平锁则是根据优先级来执行,有可能排在前面的低优先级线程被后面的高优先级插队,形成饥饿. 3.无障碍 共享资源不加锁,每个线程都可以自由读写,当监测到被其他线程

Java并发编程-非阻塞同步方式原子类(Atomic)的使用

非阻塞同步 在大多数情况下,我们为了实现线程安全都会使用Synchronized或lock来加锁进行线程的互斥同步,但互斥同步的最主要的问题就是进行线程的阻塞和唤醒所带来的性能问题,因此这种阻塞也称作阻塞同步.从处理问题的方式上说,互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题,无论共享数据是否真的会出现竞争,它都会进行加锁.用户态核心态转换.维护锁的计数器和检查是否有被阻塞的线程需要被唤醒等操作. 随着硬件指令集的发展,我们有了另一个选择:基于冲突检测的乐

c++ 高效并发编程

高效并发编程 并发编程的基本模型包括,通过消息机制来管理运行顺序的message passing, 通过互斥保护共享的shared memory. 线程同步的基本原则 最低限度共享变量,考虑使用immutable对象 尽量减小锁粒度 互斥器和条件变量足以完成绝大多数任务,尽量使用高层的封装 避繁就简,读写锁 信号量 可重入锁 ,慎用. 关于死锁 RAII 控制锁区间 注意锁的获取顺序 Copy On Write 减小锁粒度 只读的情况下用shared_ptr 轻量级共享数据 在发生修改的情况下,

互联网架构多线程并发编程高级教程(上)

#基础篇幅:线程基础知识.并发安全性.JDK锁相关知识.线程间的通讯机制.JDK提供的原子类.并发容器.线程池相关知识点? #高级篇幅:ReentrantLock源码分析.对比两者源码,更加深入理解读写锁,JAVA内存模型.先行发生原则.指令重排序?#环境说明:idea.java8.maven #第一章 并发简介 ?? ?##01 课程简介 ?? ??? ?为什么要学习并发编程? ?? ??? ??? ?方便实际开发 ?? ??? ??? ??? ?面试 ?? ??? ??? ??? ?课程特点

Java并发编程三个性质:原子性、可见性、有序性

并发编程 并发程序要正确地执行,必须要保证其具备原子性.可见性以及有序性:只要有一个没有被保证,就有可能会导致程序运行不正确 线程不安全在编译.测试甚至上线使用时,并不一定能发现,因为受到当时的CPU调度顺序,线程个数.指令重排的影响,偶然触发 线程安全的定义 比如说一个类,不论通过怎样的调度执行顺序,并且调用处不用对其进行同步操作,其都能表现出正确的行为,则这个类就是线程安全的 并发编程三个概念 原子性: 一个操作或多个操作要么全部执行且执行过程不被中断,要么不执行 可见性: 多个线程修改同一

掌握系列之并发编程-1.并发基础

掌握高并发.高可用架构 第二课 并发编程 从本课开始学习并发编程的内容.主要介绍并发编程的基础知识.锁.内存模型.线程池.各种并发容器的使用. 第一节 并发基础 并发编程 并发基础 进程 线程 线程通信 系统.包括操作系统的运行是以CPU为核心的,各种数据操作都是在CPU中进行的.所以要学习并发编程,必须要搞清楚和CPU的关系. CPU简介 经常说CPU是4核8线程的,这个的意思是4个物理核心,每个物理核心虚拟出2个虚拟核心,也就是8个虚拟核心 .每个虚拟核心在一个时刻只能运行一个线程. 进程和

2019年BAT面试通关宝典:数据结构+JVM+并发编程+分布式...

前言 金三银四俗称跳槽黄金季,很多同学都想趁着这段时间拿高薪,去更牛逼的公司工作,认识更多大牛,提升自己的职场竞争力. 那怎样才能通过BAT面试官的考核?怎样成为一名Offer收割机? 收割Offer有一个最直接的公示:Offer=硬实力+软实力+好的心态,三者缺一不可. 一.硬实力 这里说的硬实力,也就是技术上的真实积累. 怎么来体现你的技术实力?总的分为:技术深度和技术广度这两方面. 技术广度通俗的讲,就是你熟悉该技术点的使用以及基本原理.一般面试官在面试首轮会问很多技术点,来考核你是否能正