juc java_深入理解JUC(java.util.concurrent)
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)相关推荐
- 【JAVAEE】JUC(java.util.concurrent)的常见类
目录 1.Callable接口 1.1简介 1.2代码演示 1.3Runnable与Callable的区别 2.ReentrantLock 2.1ReentrantLock的常用方法 2.2Reent ...
- JUC并发编程(java util concurrent)(哔站 狂神说java juc并发编程 摘录笔记)
JUC并发编程(java util concurrent) 1.什么是JUC JUC并不是一个很神秘的东西(就是 java.util 工具包.包.分类) 业务:普通的线程代码 Thread Runna ...
- 【Java】JUC(java.util.concurrent)工具包中的并发相关
目录 一.AQS详解 AQS原理 AQS 对资源的共享方式 AQS 底层使用了模板方法模式 AQS具体应用举例 ReentrantLock CountDownLatch 二.ConcurrentHas ...
- 聊聊高并发(三十一)解析java.util.concurrent各个组件(十三) 理解Exchanger交换器
这篇讲讲Exchanger交互器,它是一种比较特殊的两方(Two-Party)栅栏,可以理解成Exchanger是一个栅栏,两边一方是生产者,一方是消费者, 1. 生产者和消费者各自维护了一个容器,生 ...
- 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore
前几篇分析了一下AQS的原理和实现,这篇拿Semaphore信号量做例子看看AQS实际是如何使用的. Semaphore表示了一种可以同时有多个线程进入临界区的同步器,它维护了一个状态表示可用的票据, ...
- 聊聊高并发(二十二)解析java.util.concurrent各个组件(四) 深入理解AQS(二)
上一篇介绍了AQS的基本设计思路以及两个内部类Node和ConditionObject的实现 聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一) 这篇 ...
- 聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一)
AQS是AbstractQueuedSynchronizer的缩写,AQS是Java并包里大部分同步器的基础构件,利用AQS可以很方便的创建锁和同步器.它封装了一个状态,提供了一系列的获取和释放操作, ...
- 聊聊高并发(三十)解析java.util.concurrent各个组件(十二) 理解CyclicBarrier栅栏
这篇讲讲CyclicBarrier栅栏,从它的名字可以看出,它是可循环使用的.它的功能和CountDownLatch类似,也是让一组线程等待,然后一起开始往下执行.但是两者还是有几个区别 1. 等待的 ...
- 聊聊高并发(二十六)解析java.util.concurrent各个组件(八) 理解CountDownLatch闭锁
CountDownLatch闭锁也是基于AQS实现的一种同步器,它表示了"所有线程都等待,直到锁打开才继续执行"的含义.它和Semaphore的语意不同, Semaphore的获取 ...
最新文章
- JAVA 判断简单密码算法_十道简单算法题二【Java实现】
- java ui调试_如何使用 IBM i System Debugger 调试 Java 程序
- 解析html语言的软件,小程序解析html标签 div-Go语言中文社区
- Apache按天截断日志工具,无法生成访问日志
- 关于能否命令Scrum团队的对话
- Mysql:好好的索引,为什么要下推?
- jQuery实现两个列表框的值之间的互换:
- java程序怎么都不是一个_java运行的流程-怎么运行java程序编了一个程序不知道怎么运行郁闷啊后缀文件名是 爱问知识人...
- 许昌学院计算机学院张伶俐,2019年教育科学学院毕业论文答辩工作安排
- 计算机网络之网络层:2、IP数据报、IP数据报分片
- Dnscrypt_wrapper 服务端的安装与配置
- User can only log in via localhost
- 智慧城轨信息技术架构及信息安全规范_会员信息 | 中国铁设:在深圳,我们打造智慧地铁的“最强大脑”...
- 统计学怎么求加权指数_统计学课程作业(统计指数)
- 静态页面:html5个人博客模板《绅士》
- 【Cactus仙人掌图】仙人掌基础知识学习笔记
- java path类_Java PathParser类代码示例
- 大神都在用的Word文档技巧,你们快来学
- java gdal_gdal java环境配置
- 什么蓝标认证BLUESIGN?蓝标认证BLUESIGN怎么做?
热门文章
- linux兼容性,Atom 1.23发布:功能增强,兼容性更好
- 【java 性能优化实战】4 工具实践:基准测试 JMH,精确测量方法性能
- MAC OS下使用OpenSSL生成私钥和公钥的方法
- 如何用atom编辑python_Atom运行Python的安装配置步骤和代码范例详解
- Python * ** 打包解包详解
- 面试前临时抱佛脚——常见的Shell脚本面试题
- 白盒测试工具_别再头疼工作效率低!这些超实用的黑盒、白盒测试方法你都用上了吗?...
- treeselect 如何选中多个_word使用技巧之-如何让你工作效率翻倍提升
- simulink和psim仿真结果不同_案例展示金属增材制造过程仿真分析 (下篇)- 微观尺度...
- 【c语言】测量字符串长度