文档章节

深入理解JUC(java.util.concurrent)

 最胖的瘦子
发布于 04/21 13:03
字数 788
阅读 24
收藏 3

Concurrent下的核心类

  1. Executor:具有runnable任务的执行者
  2. ExecutorService:一个线程池管理者,实现类有多种,能把runnable,callable提交到线程池中
  3. Semaphore:一个计数信号量
  4. ReentranLock:一个可重入的互斥锁定Lock,功能类似于synchronized锁,功能更强大写
  5. Future: 表示异步计算的结果
  6. BlockQueue:阻塞队列
  7. CompletionService:ExecutorService的扩展类,可以获得线程的执行结果
  8. CountDownLatch:一个同步辅助类,在完成一组正在其他线程执行的操作前,它允许一个或多个线程等待
  9. 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 底层实现添加的原理:

  1. 先通过lock.lock获取到锁,保证一次只有一个线程添加元素
  2. 然后copy出一个容器(可以简称副本),这个副本的长度为原数组的length+1
  3. 再往新的容器里添加这个新的数据,最后把新的容器的引用地址赋值给了之前那个旧的的容器地址

 

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

© 著作权归作者所有

粉丝 4
博文 34
码字总数 19073
作品 0
杭州
私信 提问
《java 进阶之路》 上

整整一月没有更新博客了,因为十月份和双十一新入手的6本技术相关的书,这个月看完了3本,后面的3本还得慢慢肯。 下面我就介绍下进阶高级工程师必须也是我自己都看的一些书和知识点。 1.深入...

jijs
2017/11/29
0
0
JAVA并发编程JUC基础学习(简介)

之前写过一篇并发编程的简单实例应用,Future快速实现并发编程,可以很快的在自己的项目中应用,但并不系统,之前说过总结一篇(或者一系列)java.util.concurrent 这个并发编程工具类的学习...

小海bug
02/22
29
0
Java 多线程系列目录(共43篇)

Java多线程系列目录(共43篇) 最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 ...

foxeye
2016/02/29
265
0
Java多线程系列--“基础篇”01之 基本概念

多线程是Java中不可避免的一个重要主体。从本章开始,我们将展开对多线程的学习。接下来的内容,是对“JDK中新增JUC包”之前的Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(),...

乔三爷
2015/05/09
146
0
Java线程间通信和协作的两种方式

现在计算机和智能手机都是多核处理器,为了更好地发挥设备的性能,提高应用程序的体验性,多线程是必不可少的技术。线程之间不是孤立的,它们共享进程的资源和数据,彼此之间还需要进行通信和...

落英坠露
04/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
49分钟前
15
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
8
0
太全了|万字详解Docker架构原理、功能及使用

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpa...

Java技术剑
今天
21
0
Wifiphisher —— 非常非常非常流氓的 WIFI 网络钓鱼框架

编者注:这是一个非常流氓的 WIFI 网络钓鱼工具,甚至可能是非法的工具(取决于你的使用场景)。在没有事先获得许可的情况下使用 Wifiphisher 攻击基础网络设施将被视为非法活动。使用时请遵...

红薯
今天
83
1
MongoDB 4 on CentOS 7安装指南

本教程为CentOS x86_64 7.x操作系统下,MongoDB Community x86_64 4.2(GA)安装指南。 安装方式一:yum repo在线安装 [此方式较为简单,官方推荐] Step1:新建MongDB社区版Yum镜像源。 # vim ...

王焱君
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部