Concurrent下的核心类

Executor:具有runnable任务的执行者

ExecutorService:一个线程池管理者,实现类有多种,能把runnable,callable提交到线程池中

Semaphore:一个计数信号量

ReentranLock:一个可重入的互斥锁定Lock,功能类似于synchronized锁,功能更强大写

Future: 表示异步计算的结果

BlockQueue:阻塞队列

CompletionService:ExecutorService的扩展类,可以获得线程的执行结果

CountDownLatch:一个同步辅助类,在完成一组正在其他线程执行的操作前,它允许一个或多个线程等待

CyclicBarrier:一个同步辅助类,它允许一组线程互相等待,直到达到某个公共屏障值。

Concurrent如何防止死锁

核心的接口:Lock和ReetranLock

JUC下几个常用的锁处理类:

ReentranLock:互斥锁

ReadWriteLock:读写锁

Condition:控制队列

LockSupport:阻塞原语

Semaphore:信号量

CountDownLatch:闭锁

CyclicBarrier:栅栏

Exchange:交换机

CompletableFuture:线程回调

由于synchronized可以保证数据安全,但是所有的线程只能共享一把锁,所以JUC中做了各类工具的引用

重新认识ConcurrentHashMap和CopyOnWriteArrayList

ConcurrentHashMap

ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。

Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。

一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。

CopyOnWriteArrayList

这是一个ArrayList的线程安全的变体,其原理大概可以通俗的理解为:初始化的时候只有一个容器,很常一段时间,这个容器数据、数量等没有发生变化的时候,大家(多个线程),都是读取(假设这段时间里只发生读取的操作)同一个容器中的数据,所以这样大家读到的数据都是唯一、一致、安全的.

但是后来有人往里面增加了一个数据,这个时候CopyOnWriteArrayList 底层实现添加的原理:

先通过lock.lock获取到锁,保证一次只有一个线程添加元素

然后copy出一个容器(可以简称副本),这个副本的长度为原数组的length+1

再往新的容器里添加这个新的数据,最后把新的容器的引用地址赋值给了之前那个旧的的容器地址

CopyOnWriteArrayList最大的问题是不能保证数据的实时一致性,因为若是有线程在进行写操作的时候,其他读操作的线程仍是读老的list,不能保证立马看到数据的改变

juc java_深入理解JUC(java.util.concurrent)相关推荐

  1. 【JAVAEE】JUC(java.util.concurrent)的常见类

    目录 1.Callable接口 1.1简介 1.2代码演示 1.3Runnable与Callable的区别 2.ReentrantLock 2.1ReentrantLock的常用方法 2.2Reent ...

  2. JUC并发编程(java util concurrent)(哔站 狂神说java juc并发编程 摘录笔记)

    JUC并发编程(java util concurrent) 1.什么是JUC JUC并不是一个很神秘的东西(就是 java.util 工具包.包.分类) 业务:普通的线程代码 Thread Runna ...

  3. 【Java】JUC(java.util.concurrent)工具包中的并发相关

    目录 一.AQS详解 AQS原理 AQS 对资源的共享方式 AQS 底层使用了模板方法模式 AQS具体应用举例 ReentrantLock CountDownLatch 二.ConcurrentHas ...

  4. 聊聊高并发(三十一)解析java.util.concurrent各个组件(十三) 理解Exchanger交换器

    这篇讲讲Exchanger交互器,它是一种比较特殊的两方(Two-Party)栅栏,可以理解成Exchanger是一个栅栏,两边一方是生产者,一方是消费者, 1. 生产者和消费者各自维护了一个容器,生 ...

  5. 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore

    前几篇分析了一下AQS的原理和实现,这篇拿Semaphore信号量做例子看看AQS实际是如何使用的. Semaphore表示了一种可以同时有多个线程进入临界区的同步器,它维护了一个状态表示可用的票据, ...

  6. 聊聊高并发(二十二)解析java.util.concurrent各个组件(四) 深入理解AQS(二)

    上一篇介绍了AQS的基本设计思路以及两个内部类Node和ConditionObject的实现 聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一) 这篇 ...

  7. 聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一)

    AQS是AbstractQueuedSynchronizer的缩写,AQS是Java并包里大部分同步器的基础构件,利用AQS可以很方便的创建锁和同步器.它封装了一个状态,提供了一系列的获取和释放操作, ...

  8. 聊聊高并发(三十)解析java.util.concurrent各个组件(十二) 理解CyclicBarrier栅栏

    这篇讲讲CyclicBarrier栅栏,从它的名字可以看出,它是可循环使用的.它的功能和CountDownLatch类似,也是让一组线程等待,然后一起开始往下执行.但是两者还是有几个区别 1. 等待的 ...

  9. 聊聊高并发(二十六)解析java.util.concurrent各个组件(八) 理解CountDownLatch闭锁

    CountDownLatch闭锁也是基于AQS实现的一种同步器,它表示了"所有线程都等待,直到锁打开才继续执行"的含义.它和Semaphore的语意不同, Semaphore的获取 ...

最新文章

  1. JAVA 判断简单密码算法_十道简单算法题二【Java实现】
  2. java ui调试_如何使用 IBM i System Debugger 调试 Java 程序
  3. 解析html语言的软件,小程序解析html标签 div-Go语言中文社区
  4. Apache按天截断日志工具,无法生成访问日志
  5. 关于能否命令Scrum团队的对话
  6. Mysql:好好的索引,为什么要下推?
  7. jQuery实现两个列表框的值之间的互换:
  8. java程序怎么都不是一个_java运行的流程-怎么运行java程序编了一个程序不知道怎么运行郁闷啊后缀文件名是 爱问知识人...
  9. 许昌学院计算机学院张伶俐,2019年教育科学学院毕业论文答辩工作安排
  10. 计算机网络之网络层:2、IP数据报、IP数据报分片
  11. Dnscrypt_wrapper 服务端的安装与配置
  12. User can only log in via localhost
  13. 智慧城轨信息技术架构及信息安全规范_会员信息 | 中国铁设:在深圳,我们打造智慧地铁的“最强大脑”...
  14. 统计学怎么求加权指数_统计学课程作业(统计指数)
  15. 静态页面:html5个人博客模板《绅士》
  16. 【Cactus仙人掌图】仙人掌基础知识学习笔记
  17. java path类_Java PathParser类代码示例
  18. 大神都在用的Word文档技巧,你们快来学
  19. java gdal_gdal java环境配置
  20. 什么蓝标认证BLUESIGN?蓝标认证BLUESIGN怎么做?

热门文章

  1. linux兼容性,Atom 1.23发布:功能增强,兼容性更好
  2. 【java 性能优化实战】4 工具实践:基准测试 JMH,精确测量方法性能
  3. MAC OS下使用OpenSSL生成私钥和公钥的方法
  4. 如何用atom编辑python_Atom运行Python的安装配置步骤和代码范例详解
  5. Python * ** 打包解包详解
  6. 面试前临时抱佛脚——常见的Shell脚本面试题
  7. 白盒测试工具_别再头疼工作效率低!这些超实用的黑盒、白盒测试方法你都用上了吗?...
  8. treeselect 如何选中多个_word使用技巧之-如何让你工作效率翻倍提升
  9. simulink和psim仿真结果不同_案例展示金属增材制造过程仿真分析 (下篇)- 微观尺度...
  10. 【c语言】测量字符串长度