Java多线程包
文章平均质量分 84
吃着油条唱歌
这个作者很懒,什么都没留下…
展开
-
synchronized
synchronized 原理 1 synchronized特点 1.1 原子性 操作不可中断,要么执行不被中断,要么不执行。 1.2 可见性 多线程访问同一资源时,该资源状态信息对其他线程可见。 1.3 有序性 java允许编辑器和处理器对指令进行重排,而synchronied和volatile都有有序性,即线程执行同步代码是分先后顺序的。 1.4 可重入性 synchronized和ReentrantLock都是可重入锁,即一个线程拥有了锁仍然可以重复申请自己持有的锁。 2 synchronized 用原创 2022-01-18 16:04:21 · 107 阅读 · 0 评论 -
JUC:ThreadPoolExecutor
ThreadPoolExecutor 介绍 源码地址:java.util.concurrent.ThreadPoolExecutor 线程池意义: 减少开销:重复使用纤尘资源,降低创建和回收的效率。 便于管理:帮你维护线程ID,线程状态等信息。 源码 继承关系 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NXSWA6nP-1642494029647)(./image/t1.jpg)] ThreadPoolExecutor继承了AbstractExectorService原创 2022-01-18 16:23:00 · 206 阅读 · 0 评论 -
JUC:ConcurrentHashMap
ConcurrentHashMap 看前 本博客只是为了记录,学习流程,学习源码其大部分看的是ConcurrentHashMap 1.8 源码分析这位大佬的博客,写的十分详细,图文并茂非常易懂,十分推荐。我这篇博客只是在他的基础上加了点自己的理解(肯定有不少理解不到位的地方)以及查询了一些没讲到的函数。 介绍 源码: java.util.concurrent.ConcurrentHashMap HashMap有线程安全问题,导致出现链表死循环的情况。HashTable和ConcurrentHashMap没有原创 2022-01-18 16:20:16 · 183 阅读 · 0 评论 -
HashMap
HashMap 1 介绍 拉链散列算法的包装,在JDK1.8中运用数组+链表+红黑树的方法。 2 源码 2.1 属性 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//初始容量 static final int MAXIMUM_CAPACITY = 1 << 30;//最大容量 static final float DEFAULT_LOAD_FACTOR = 0.75f;//默认装载因子 static final int TRE原创 2022-01-18 16:15:07 · 99 阅读 · 0 评论 -
JUC:CountDownLatch
CountDownLatch 介绍 基于AQS实现了闩(shuān)锁。运行一条或多条线程等待其他线程中的一组操作完成后,在继续执行。 源码 地址:java.util.concurrent.CountDownLatch 流程:要解决的问题,主线程等待子线程的完成。主线程等待被唤醒,唤醒条件为子线程都完成,AQS中的state可以表示为等待执行完成的任务数,当一个任务完成,state–,当state==0时唤醒主线程。 属性 private final Sync sync; 属性初始化时机 public C原创 2022-01-18 16:13:45 · 253 阅读 · 0 评论 -
JUC:ReentrantLock
ReentrantLock 1 介绍 源码地址:java.util.concurrent.locks.ReentrantLock ReentrantLock基于AQS,实现了公平锁和非公平锁,在开发中可以用它对共享资源进行同步,此外和synchronized一样,ReentrantLock支持可冲入,但ReentrantLock在调度上更加灵活,支持更丰富的功能。 2 源码 2.1 继承关系 继承关系如下图: public class ReentrantLock implements Lock, java原创 2022-01-18 16:12:49 · 228 阅读 · 0 评论 -
JUC:AQS
AQS 1 介绍 什么事JUC? Java 并发包 java.util.concurrent。 什么是AQS?全称:AbstractQueuedSynchronizer,他是一个抽象类,也是后面介绍的并发包的基础工具类,实现了ReentrantLock,CountDownLatch,Semaphore,FutureTask的基础。 为什么要写AQS 因为CAS只能对内存中的某个值进行无锁同步操作,但是无法对某个对象进行无锁同步操作。AQS就是为了解决这个问题而被写出来的。 2 源码(独占模式) 源码位置:原创 2022-01-18 16:11:04 · 81 阅读 · 0 评论 -
CAS原理
CAS 1 为什么要写CAS 有时操作者不希望让操作系统那么“悲观”,每次都使用同步原语对共享资源进行资源锁定,而是希望让线程反复“乐观”的尝试获取共享资源,如果空闲那么是用,如果被占用,则继续尝试。CAS就这样应运而生了。 2 实现原理 2.1 实现 资源Z设置了一个值假设叫Zp,Zp为0代表资源空闲,1代表资源被占用。A,B两个线程发现Zp为0,则都去争抢这个资源,A运气好抢到了这个资源,将Zp改为1,B也不会放弃,会不断回来看看Zp变为0了没。在A获得时间片时,它将oldValue(读到的资源对象的状原创 2022-01-18 16:07:40 · 401 阅读 · 0 评论