fail-fast 机制

一种错误检测机制。常见的使用fail-fast方式遍历的容器有HashMap和ArrayList等。当在迭代集合的过程中该集合在结构上发生改变的时候,比如单线程遍历时remove(),多线程一个读取数据一个操作数据,就有可能会发生fail-fast,即抛出ConcurrentModificationException异常。

比如

ArrayList<String> list = Arrays.asList("a","b","c","d");
for(String i : list){if(i.equals("c")list.remove("c");
}

原因是这些类都继承Iterator接口。编译期间编译器将for的迭代转化为for循环的实现形式。

fail-safe 机制

先复制原有集合内容,在拷贝的集合上进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,不会触发Concurrent Modification Exception。java.util.concurrent包下的容器都是fail-safe机制,可以在多线程下并发使用,并发修改。

同步容器

在Java中,同步容器主要包括2类:

  • Vector、Stack、HashTable
  • Collections类中提供的静态工厂方法创建的类

缺点:

同步容器效率低,fail-fast机制,对同步容器进行迭代的同时修改它的内容,会报ConcurrentModificationException异常。

阻塞队列与非阻塞队列

阻塞队列:当队列满时,队列会阻塞插入元素的线程,直到队列不满;当队列为空时,队列会阻塞获取元素的线程,直到队列不空。

非阻塞队列:若线程从中获取元素,若没有则直接返回空,不会阻塞当前线程

分段锁

简单来说就是将数据进行分段,每一段锁用于锁容器中的一部分数据,那么当多线程访问容器里的不容数据段的数据时,线程间就不会存在锁竞争,从而可以有效地提高并发访问效率。有些方法需要跨段,比如size(),就需要按照顺序锁定所有的段,完成操作后,再按顺序释放锁。

并发容器

采用fail-safe机制。

非阻塞队列

CopyOnWriteArrayList

  • 读写分离,读操作不加锁,所有线程都不会阻塞。写操作加锁,线程会阻塞。
  • 写线程获取到锁,其他线程包括读线程阻塞
  • 实现方式是写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array。
  • 适用于读远远大于写的时候。

ConcurrentHashMap 
多线程环境下,使用Hashmap进行put操作可能会引起死循环。

  • Hashtable实现同步是利用synchronized关键字进行锁定的,其是针对整张哈希表进行锁定的,即每次锁住整张表让线程独占,在线程安全的背后是巨大的浪费。
  • ConcurrentHashMap采用分段锁,单独锁住每一个桶(segment),ConcurrentHashMap将哈希表分为16个桶(默认值),get(),put(),remove()等常用操作只锁当前需要用到的桶。原来只能一个线程进入,现在却能同时接受16个写线程并发进入。有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。这里“按顺序”是很重要的,否则极有可能出现死锁。

ConcurrentLinkedQueue

  • 一个基于链接节点的无界线程安全队列。
  • 此队列按照 FIFO(先进先出)原则对元素进行排序,新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。
  • 它的主要api是offer和poll, offer将指定元素插入此队列的尾部 ;poll 获取并移除此队列的头,如果此队列为空,则返回 null。

阻塞队列BlockingQueue

在线程池中有所运用,获取不到任务就一直处于阻塞状态。

ArrayBlockingQueue

  • 基于数组的阻塞队列实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,这是一个常用的阻塞队列。
  • ArrayBlockingQueue内部保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。

LinkedBlockingQueue

  • 基于链表的阻塞队列,同ArrayListBlockingQueue类似,其内部也维持着一个数据缓冲队列(该队列由一个链表构成),当生产者往队列中放入一个数据时,队列会从生产者手中获取数据,并缓存在队列内部,而生产者立即返回;只有当队列缓冲区达到最大值缓存容量时(LinkedBlockingQueue可以通过构造函数指定该值),才会阻塞生产者队列,直到消费者从队列中消费掉一份数据,生产者线程会被唤醒,反之对于消费者这端的处理也基于同样的原理。
  • 没有指定其容量大小,LinkedBlockingQueue会默认一个类似无限大小的容量(Integer.MAX_VALUE)

PriorityBlockingQueue

支持优先级的无界阻塞队列,默认情况下元素按照自然顺序升序排列,可以自定义类实现compareTo()方法来指定元素的排序规则,或在初始化PriorityBlockingQueue时指定构造参数Comparator来对元素进行排序,但不能保证同优先级元素的顺序;

多线程—并发容器与机制相关推荐

  1. 多线程---并发容器的使用

    多线程---并发容器的使用 1. 容器概览 2. 容器的使用 1. Map 1. HashTable 2. HashMap 3. SynchronizedHashMap 4. ConcurrentHa ...

  2. java 计时器_Java多线程并发容器之并发倒计时器

    从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; 执行后,size-这种方式来实现.但是在多线程并发的情 ...

  3. java 容器 线程_JAVA多线程并发容器

    1.ArrayList线程不安全:CopyOnWriteArrayList线程安全 package concurrent; import java.util.ArrayList; import jav ...

  4. Java多线程之并发容器(五)

    1.hashtable和vector 它们是支持并发操作的并发容器,hashtable只不过是在hashmap的基础上,所有的方法上都加上synchronized关键字,vector在ArrayLis ...

  5. Java多线程系列(七):并发容器的原理,7大并发容器详解、及使用场景

    之前谈过高并发编程系列: 高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 高并发编程系列:CountDownLatch.Semaphore等4大并发工具类详解 高并发编程系列:4大J ...

  6. Java多线程概念[同步容器,并发容器](二)

    同步容器 同步容器通过synchronized关键字修饰容器,保证同一时刻只有一个线程使用容器,从而使容器线程安全. synchronized的意思的同步. 1.Vector和ArrayList都实现 ...

  7. 多线程高并发 底层锁机制与优化的最佳实践——各种锁的分类 || synchronized 关键字 倒底锁的是什么东西?|| CAS与ABA问题||锁优化||轻量级锁一定比重量级锁的性能高吗

    多线程高并发 底层锁机制与优化的最佳实践 各种锁的分类 加上synchronized 关键字,共享资源就不会出错 synchronized 关键字 倒底锁的是什么东西? synchronized 锁的 ...

  8. 深入学习Java多线程——并发机制底层实现原理

    2019独角兽企业重金招聘Python工程师标准>>> Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执 ...

  9. 对Java多线程编程的初步了解,实现多线程的三种方式以及多线程并发安全的线程同步机制

    什么叫进程?什么叫线程? 进程相当于一个应用程序,线程就是进程中的一个应用场景或者说是一个执行单元,一个进程可以启动多个线程,每个线程执行不同的任务,一个线程不能单独存在,他必须是进程的一部分,当进程 ...

最新文章

  1. php点击按钮加载控制器,php – Codeigniter 3自动加载控制器
  2. OPPO尝鲜android版本更新,安卓11迎来四大贴心升级,OPPO小米率先尝鲜
  3. 图着色问题贪心算法c语言,区间图着色问题(贪心算法)C++实现
  4. 开始学习C#.Net
  5. 数据库期末总结笔记( 零基础 )
  6. 非客观书评(三)——《ARM Cortex-M3 权威指南》
  7. 二维码扫描ZXing简化
  8. quartz java 实现_Quartz使用-入门使用(java定时任务实现)
  9. Java+opencv+mysql实现人脸识别源码(人脸采集入库+人脸识别相似度)
  10. 苹果鼠标驱动_一款鼠标让工作更高效——咪鼠S2智能语音鼠标测评
  11. javascript 替换
  12. STM32H743IIT6+USB3300,USB_HS高速双向HID通讯开发
  13. Linux C/C++编程之(十四)文件操作相关函数
  14. 台州计算机职称查询,台州职称证书可网上自助打印了
  15. Life of Pie 少年派的奇幻漂流
  16. 实验五 java gui
  17. openpyxl的基本使用
  18. Flutter之微信支付实战模板
  19. 网页转pdf乱码问题,楷体部分出乱码
  20. c语言上机怎么弄一元一次方程,怎么在c语言中编写一元一次方程

热门文章

  1. oracle 按某个字段分类汇总,[数据库]Oracle语句分类汇总
  2. fillna函数_听说这些pandas函数,是数据科学家和软件工程师的最爱
  3. window安装python3装环境变量_Windows下的Python安装与环境变量的配置
  4. python pexpect timeout_Python 的 pexpect 模块的问题
  5. easyui数据请求两个url_easyui使用是调用两次后台请求(解决)
  6. python的objectproperty,python中property(lambda self: object())简单解释,,最后4行lambda
  7. 机考可以作弊吗_法考主观题也全面机考?不慌,看这篇文章
  8. controller方法要trycatch吗_拜托,别再满屏try catch了,试试统一异常处理吧
  9. EF获取多个数据集以及MySQL分页数据查询优化
  10. [AGC016B]Colorful Hats