当前位置:网站首页>JUC(一)- JUC学习概览 - 对JUC有一个整体的认识
JUC(一)- JUC学习概览 - 对JUC有一个整体的认识
2022-08-02 05:03:00 【学到的心态】
开启JUC的学习,先了解JUC要学习哪些东西,对JUC有一个整体的认识.
JUC学习过程中通过不断回顾以下的几个问题,抓住JUC学习的重点:
- JUC框架包含几个部分?
- 每个部分有哪些核心的类?
- 最最核心的类有哪些?
JUC包分为以下5个方面
- Lock框架
- Tools类
- Collections: 并发集合
- Atomic: 原子类
- Executors: 线程池
一. Lock框架和Tools类
看一下类的结构
1. 接口
condition 接口将Object监视器方法(wait、notify)分解为不同的对象,以便和Lock实现结合使用。
其中:Lock代替了synchronized的方法和语句使用、condition 替代了 Object 监视器方法。
可以通过 await 、signal 来休眠和唤醒线程。
ReadWriteLock接口维护了一对锁,一个用于只读,另一个用于写入。
只要没有writer ,读取锁可以有多个reader 线程同时保持。
写入是独占的。
AbstractOwnableSynchonizer :可以让线程以独占的方式拥有同步器。为创建锁和相关同步器提供了基础
AbstractQueuedSynchonizer : 为依赖于FIFO等待对列的阻塞锁和相关同步器(信号量、事件等)提供了一个框架。
通过 int 值来表示状态,为同步器提供一个基础。
2. 实现类
LockSupport : 用于创建锁和是其他不同类基本线程的阻塞原语 。和Thread中的 Thread.suspend() 和 Thread.resume() 有点类似。LockSupport中的park和unpark 的作用分别是文件堵塞线程和接触堵塞线程。但不会像 Thread.suspend() 和 Thread.resume() 引发死锁。
ReentrantLock : 是一个可重入的互斥锁 Lock,它具有与 synchronized 方法同样的功能,但功能更强大。
ReentrantReadWriteLock :包括Lock子类ReadLock和WriteLock。ReadLock是共享锁,WriteLock是独占锁。
StampedLock: 控制锁有三种模式(写,读,乐观读)。一个StampedLock是由版本和模式两个部分组成
3. 工具类
CountDownLatch:线程辅助类,多线程执行时,可以让一个或多个线程一直等待。
CyclicBarrier:线程辅助类,它允许一组线程相互等待,直到到达某个公共的屏障点。因为在barrier释放等待线程后可以重用,所以称为循环的barrier。
Semaphore:计数信号量,它维护了一个许可集。通过 acquire 堵塞线程,通过 release 添加许可,释放一个正在堵塞的获取者。
Exchanger:主要用于两个线程之间的数据交换。它提供一个同步点,在这个同步点中,两个线程可以交换彼此的数据。两个线程通过exchange() 交换数据,当两个线程都执行了exchange() 到达同步点时,这两个线程就可以交换数据了。
二. 原子类
基本特性是:在多线程环境下,当有多个线程同时执行原子类方法时,具有排它性。
基础类型:AtomicBoolean,AtomicInteger,AtomicLong
数组:AtomicIntegerArray,AtomicLongArray,BooleanArray
引用:AtomicReference,AtomicMarkedReference,AtomicStampedReference
FieldUpdater:AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater。
三. 并发集合
队列
ArrayBlockingQueue:由数组支持的有界阻塞(FIFO)队列。
ConcurrentLinkedQueue:基于链表的无界线程安全(FIFO)队列。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。
List、Set 和 Map
CopyOnWriteArrayList:线程安全的ArrayList,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。需要较大的开销,遍历比可变操作的效率高。
CopyOnWriteArraySet:将所有操作转发至CopyOnWriteArayList来进行操作,能够保证线程安全。在add时,会调用addIfAbsent,由于每次add时都要进行数组遍历,因此性能会略低于CopyOnWriteArrayList。
ConcurrentHashMap:线程安全的HashMap。ConcurrentHashMap在JDK 7之前是通过Lock和segment(分段锁)实现,JDK 8 之后改为CAS+synchronized来保证并发安全。
ConcurrentSkipListMap:相当于线程安全的TreeMap。
四. Executors: 线程池
1. 接口
Executor:接口提供一种将任务提交和每个任务将如何运行的机制(包括线程使用的细节、调度等)。通常使用Executor而不是显式地创建线程。
ExecutorService: 可以关闭 ExecutorService,这将导致其停止接受新任务。关闭后,执行程序将最后终止,这时没有任务在执行,也没有任务在等待执行,并且无法提交新任务。
ScheduledExecutorService:继承自ExecutorService,可设定在定期执行或延后的任务。
FutureTask:为Future提供了基础实现,如获取任务执行结果(get)和取消任务(cancel)等。如果任务尚未完成,获取结果将堵塞。FutureTask 常用来封装 Callable 和 Runnable,也可以作为一个任务提交到线程池中执行。FutureTask 的线程安全由CAS来保证。
2. 实现类
ThreadPoolExecutor:实现了AbstractExecutorService接口,也是一个 ExecutorService。
ScheduledThreadExecutor:实现ScheduledExecutorService接口,可安排在给定的延迟后运行命令,或者定期执行命令。
Fork/Join框架:技术是分治算法(Divide-and-Conquer)的并行实现。
Executors:工具类,用其可以创建ExecutorService、ScheduledExecutorService、ThreadFactory、Callable等对象。它的使用融入到了ThreadPoolExecutor, ScheduledThreadExecutor和ForkJoinPool中。
参考:https://pdai.tech/md/java/thread/java-thread-x-juc-overview.html
边栏推荐
猜你喜欢
Google 安装印象笔记剪藏插件
[email protected](使用passwordYES)"/>
Navicat报错:1045 -拒绝访问用户[email protected](使用passwordYES)
navicat connects to MySQL and reports an error: 1045 - Access denied for user 'root'@'localhost' (using password YES)
matlab simulink 模糊pid结合smith控制温度
[PSQL] 窗口函数、GROUPING运算符
Mysql存储json格式数据
"Digital reconstruction of the system, getting the CEO is the first step"
interrupt()、interrupted()和isInterrupted()你真的懂了吗
matlab simulink 飞机飞行状态控制
navicat无法连接mysql超详细处理方法
随机推荐
Browser onload event
MySQL 灵魂 16 问,你能撑到第几问?
Google Chrome(谷歌浏览器)安装使用
MySQL String Concatenation - Various String Concatenation Practical Cases
2021年软件测试面试题大全
系统(层次)聚类
ERROR 1045 (28000) Access denied for user 'root'@'localhost'Solution
2022河南萌新联赛第(四)场:郑州轻工业大学 A - ZZULI
mysql练习题
12 reasons for MySQL slow query
数学建模学习笔记:层次分析法(AHP)
18年程序员生涯,读了200多本编程书,挑出一些精华分享给大家
Matlab论文插图绘制模板第41期—气泡图(bubblechart)
MySQL 8.0.28 version installation and configuration method graphic tutorial
H5接入支付流程-微信支付&支付宝支付
IOT物联网概述及应用层架构入门篇
mysql安装教程【安装版】
navicat无法连接mysql超详细处理方法
区块元素、内联元素(<div>元素、span元素)
【HCIE】NO.30 OSPFv3的基本配置