![](https://img-blog.csdnimg.cn/direct/fd58f43557dc4a05bd9abe5ce12c9c42.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JUC
文章平均质量分 92
并发编程
早睡早起啦
感谢关注,csdn已经不上线了,不会在更新了。 csdn都是个人在大二到大四期间学习的笔记,有些内容可能并不是正确的,请理解下,技术文章在掘金(持续更新) https://juejin.cn/user/4248168663101239,如果想咨询up的话技术/生活/未来规划,wx: hakusai22.
展开
-
ReentrantReadWriteLock---JDK1.8源码分析
ReentrantReadWriteLock源码分析一. ReentrantReadWriteLock介绍二. ReentrantReadWriteLock源码分析①. ReentrantReadWriteLock继承关系分析②. ReentrantReadWriteLock的属性分析③. ReentrantReadWriteLock的内部类---WriteLock④. ReentrantReadWriteLock的内部类---ReadLock⑤. ReentrantReadWriteLock的内部类---原创 2021-05-17 20:10:09 · 238 阅读 · 0 评论 -
JUC并发学习----Java内存模型_volatile_final原理
Java内存模型一. Java内存模型概念二.Java内存模型的组成①. 主内存②. 工作内存三. JVM内存操作的并发问题①. 工作内存数据一致性②. 指令重排序优化四. Java内存间的交互操作五. Java内存交互的基本操作①. lock (锁定)②. unlock (解锁)③. read (读取)④. load (载入)⑤. use (使用)⑥. assign (赋值)⑦. store (存储)⑧. write (写入)六. Java内存交互基本操作的3个特性①. 原子性(Atomicity)②.原创 2021-07-17 17:23:44 · 176 阅读 · 1 评论 -
多线程学习---AbstractQueuedSynchronizer分析
AbstractQueuedSynchronizer分析一. AQS是什么?①. AQS简单介绍②. AQS为什么是JUC内容中最重要的基石?二. AQS内部体系架构①. AQS内部架构图②. 详解AQS内部代码有什么?③. CLH队列(三个大牛的名字组成),为一个双向队列④. Node内部结构三. 从ReentrantLock开始解读AQS①. ReentrantLock结构图②. 模拟银行办理业务案列③. lock方法开始看看公平和非公平④. lock()源码_我这里分析的非公平锁⑤. acquire(原创 2021-07-13 22:02:08 · 341 阅读 · 0 评论 -
多线程学习---LockSupport
LockSupport一. LockSupport介绍二. wait和Notify限制三. await和Signal限制四. LockSupport方法介绍①. 什么是LockSupport?②. 阻塞方法③. 唤醒方法(注意这个permit最多只能为1)五. LockSupport案例解析六. LockSupport 面试题目①. 为什么可以先唤醒线程后阻塞线程?②. 为什么唤醒两次后阻塞两次,但最终结果还会阻塞线程?一. LockSupport介绍LockSupport是用来创建锁和其他同步类的原创 2021-07-13 20:44:49 · 162 阅读 · 1 评论 -
多线程学习---Linux相关命令
Linux相关命令一. Linux命令之top①. 整机:top,查看整机系统新能②. uptime:系统性能命令的精简版二. Linux之cpu查看vmstat①. vmstat②. procs属性③. cpu属性三. Linux之cpu查看pidstat①. mpstat -P ALL 2②. pidstat -u 1 -p 进程编号四. Linux之内存查看free和pidstat①. free 应用程序可用内存数②. pidstat -p 进程号 -r 采样间隔秒数五. Linux之硬盘查看df六原创 2021-07-12 22:28:53 · 382 阅读 · 1 评论 -
多线程学习----死锁编码及定位分析
死锁编码及定位分析一. 概念二. 产生死锁的原因三. 死锁产生的四个必要条件①. 互斥②. 占有且等待③. 非抢占式④. 循环等待四. 死锁代码五. 如何排查死锁一. 概念死锁是指两个或多个以上的进程在执行过程中,因争夺资源而造成一种互相等待的现象,若无外力干涉那他们都将无法推进下去。如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。二. 产生死锁的原因系统资源不足进程运行推进的顺序不对资源分配不当三. 死锁产生的四个必要条件①原创 2021-07-10 23:16:08 · 95 阅读 · 0 评论 -
多线程学习----线程池
线程池一. Java中有哪些方法获取多线程①. 实现Runnable接口①. 实现Callable接口二. ThreadPoolExecutor①. 为什么用线程池②. 线程池的好处③. 架构说明④. 创建线程池1. Executors.newFixedThreadPool(int i) :创建一个拥有 i 个线程的线程池2. Executors.newSingleThreadExecutor:创建一个只有1个线程的 单线程池3. Executors.newCacheThreadPool(); 创建一个可扩原创 2021-07-10 22:03:06 · 138 阅读 · 0 评论 -
多线程学习----Synchronized和Lock的区别
Synchronized和Lock的区别一. Synchronized和Lock介绍二. Synchronized和Lock的区别①. synchronized属于JVM层面,属于java的关键字②. 使用方法③. 等待是否中断④. 加锁是否公平⑤. 锁绑定多个条件Condition三. 场景实战一. Synchronized和Lock介绍早期的时候我们对线程的主要操作为: synchronized wait notify然后后面出现了替代方案: lock await sign原创 2021-07-10 21:10:23 · 85 阅读 · 1 评论 -
多线程学习----阻塞队列
阻塞队列一. 阻塞队列介绍二. BlockingQueue阻塞队列①. BlockingQueue接口的实现类②. BlockingQueue核心方法_ArrayBlockingQueue测试1. 抛出异常组_add和remove2. 布尔类型组__offer和poll3. 阻塞队列组__put和take4. 不见不散组__offer和poll加时间三. SynchronousQueue队列四. 生产者消费者模式①. synchronized+wait+notifyAll实现生产者和消费者②. Reentr原创 2021-07-10 20:56:57 · 301 阅读 · 1 评论 -
多线程学习----Java中锁的介绍
Java中锁的介绍一. Java锁之公平锁和非公平锁①. 公平锁②. 非公平锁③. 两者区别二. 可重入锁和递归锁ReentrantLock①. 可重入锁介绍②. 可重入锁验证__ReenterLock案列③. 可重入锁验证__synchronized案列④. 当我们在getLock方法加两把锁会是什么情况呢?⑤. 当我们在getLock方法加两把锁,但是只解一把锁会出现什么情况呢?⑥. 当我们只加一把锁,但是用两把锁来解锁的时候,又会出现什么情况呢?三. Java锁之自旋锁①. 自旋锁介绍②. 自旋锁优原创 2021-07-09 21:15:32 · 188 阅读 · 0 评论 -
Collection类---集合类线程不安全之并发修改异常
集合类线程不安全之并发修改异常一. List集合测试①. ArrayList集合不安全测试③. 解决方案一: Vector④. 解决方案二: Collections.synchronized()⑤. 解决方案三: CopyOnWriteArrayList二. Set集合线程不安全测试①. HashSet②. 解决方案一: Collections.synchronizedSet(new HashSet<>());③. 解决方案二: CopyOnWriteArraySet三. Map集合线程不安全测原创 2021-07-09 20:49:08 · 272 阅读 · 0 评论 -
CAS学习---CAS底层原理
CAS底层原理一. CAS介绍二. CAS代码实现三. CAS底层原理①. Unsafe类②. 变量valueOffset③. 变量value用volatile修饰④. getAndAddInt() 源码分析⑤. 底层汇编⑥. 原子引用四. CAS缺点五. 解决ABA问题①. ABA问题介绍②. ABA问题解决方法一. CAS介绍CAS的全称是Compare-And-Swap,它是CPU并发原语。它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。CAS原创 2021-07-09 20:20:15 · 226 阅读 · 0 评论 -
Volatile----Volatile禁止指令重排
Volatile禁止指令重排一. 指令重排介绍二. 指令重排 --例子1三. 指令重排--例子2四. 指令重排--例子3五. Volatile针对指令重排做了啥一. 指令重排介绍计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种:单线程环境里面确保最终执行结果和代码顺序的结果一致处理器在进行重排序时,必须要考虑指令之间的数据依赖性多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。原创 2021-07-08 13:26:43 · 279 阅读 · 0 评论 -
Volatile----Volatile不保证原子性
Volatile不保证原子性一. 原子性介绍二. 不保证原子性代码验证三. 为什么出现数值丢失?四. n++反编译成字节码文件查看五. 解决原子性问题①. 在方法上加入 synchronized②. AtomicInteger原子类③. 测试一. 原子性介绍不可分割,完整性,也就是说某个线程正在做某个具体业务时,中间不可以被加塞或者被分割,需要具体完成,要么同时成功,要么同时失败。数据库也经常提到事务具备原子性。(ACID)二. 不保证原子性代码验证为了测试volatile是否保证原原创 2021-07-08 13:15:20 · 136 阅读 · 2 评论 -
Volatile----Volatile和JMM内存模型的可见性
Volatile和JMM内存模型的可见性一. Volatile介绍二. JMM介绍①. JMM内存模型图②. JMM的特性三. 缓存一致性四. MESI五. 总线嗅探①. 那么是如何发现数据是否失效呢?六. 总线风暴①. 总线嗅探技术有哪些缺点?七. 可见性代码验证一. Volatile介绍Volatile在日常的单线程环境是应用不到的。Volatile是Java虚拟机提供的轻量级的同步机制(三大特性):保证可见性不保证原子性禁止指令重排二. JMM介绍JMM是Java内原创 2021-07-08 12:57:58 · 207 阅读 · 0 评论 -
线程间通信方式(Java)
线程间通信机制一.Syncrhoized加锁的线程的Object类的wait()/notify()/notifyAll()二.ReentrantLock类加锁的线程的Condition类的await()/signal()/signalAll()三. 通过管道进行线程间通信:字节流/字符流一.Syncrhoized加锁的线程的Object类的wait()/notify()/notifyAll()wait()、notify()和notifyAll()是Object类中的方法wait()、noti原创 2021-05-22 16:49:27 · 109 阅读 · 0 评论 -
Synchronized---实现原理与源码分析
Synchronized---实现原理与源码分析一. Synchronized的特性①. 原子性②. 可见性③. 有序性④. 可重入性二. Synchronized的使用①. 修饰普通方法②. 修饰代码块③. 修饰静态方法三. Synchronized锁反编译查看①. 同步方法②. 同步代码块四. JVM对Synchronized的优化①. 锁膨胀②. 偏向锁③. 轻量级锁④. 重量级锁⑤. 锁消除⑥. 锁粗化⑦. 5.4 自旋锁与自适应自旋锁一. Synchronized的特性①. 原子性原创 2021-05-17 21:35:14 · 164 阅读 · 0 评论 -
Condition接口---JDK1.8源码分析
Condition源码分析一. Condition介绍二. Condition源码分析①. Condition接口类方法分析②. Condition实现类ConditionObject属性分析③. ConditionObject类中重写await()方法源码分析1. ConditionObject类中addConditionWaiter()方法分析2. ConditionObject类中fullyRelease()方法分析3. AQS类中isOnSyncQueue()方法分析4. ConditionObje原创 2021-05-15 17:05:18 · 160 阅读 · 1 评论 -
CyclicBarrier---JDK1.8源码分析
CyclicBarrier源码分析一. CyclicBarrier介绍二. CyclicBarrier源码分析①. CyclicBarrier的内部类---Generation类②. CyclicBarrier成员变量③. CyclicBarrier的构造函数③. await()方法源码分析④. dowait()方法⑤. breakBarrier() 方法⑥. nextGeneration() 方法⑦. reset()方法三. CyclicBarrier特点一. CyclicBarrier介绍Cycl原创 2021-05-15 15:05:25 · 249 阅读 · 1 评论 -
CountDownLatch---JDK1.8源码分析
CountDownLatch源码分析一. CountDownLatch介绍二. CountDownLatch源码分析一. CountDownLatch介绍二. CountDownLatch源码分析原创 2021-05-15 14:18:29 · 530 阅读 · 0 评论 -
Semaphore---JDK1.8源码分析
Semaphore源码分析一. Semaphore介绍二. Semaphore源码分析①. Semaphore的内部类--- Sync类②. Semaphore的内部类--- NonfairSync类③. Semaphore的内部类--- FairSync类④. Semaphore构造函数⑤. acquire()和acquire(int permits)方法1. acquireSharedInterruptibly(int arg)2. tryAcquireShared(int acquires)3.原创 2021-05-14 17:26:47 · 186 阅读 · 2 评论 -
ThreadPoolExecutor线程池---JDK1.8源码分析
线程池源码分析---JDK1.8一. 线程池的创建(五种方式)①newSingleThreadExecutor() 单核线程池②. newFixedThreadPool(int number)固定核心线程池③. newCachedThreadPool()缓存线程池④. newScheduledThreadPool()周期性定时任务线程池⑤. newWorkStealingPool()抢占式操作的线程池二. ThreadPoolExecutor源码分析①. 属性分析_太多了②. 构造函数ThreadPoolE原创 2021-04-29 14:21:09 · 188 阅读 · 0 评论 -
AbstractQueuedSynchronizer---JDK1.8源码分析
AQS源码分析---JDK1.8一. AQS相关知识点①. AQS介绍②. AQS核心思想②. 实现方式:③. CLH--- 同步队列二. AQS源码分析①. state状态②. AQS类中的Node类③. 获取独占锁acquire()④. addWaiter(Node) 添加元素到阻塞队列中⑤. enq() 自旋操作添加元素⑥. acquireQueued() 尝试获取锁⑦. shouldParkAfterFailedAcquire() 判断失败获取后是否可以挂起当前线程⑧. parkAndCheckI原创 2021-05-06 20:17:19 · 283 阅读 · 1 评论 -
LockSupport类---JDK1.8源码分析
LockSupport一. LockSupport介绍二. LockSupport分析①. LockSupport类的属性②. LockSupport类的构造函数③. park(Object blocker)方法 和 park()方法分析④. parkNanos(Object blocker,long nanos)方法 和 parkNanos(long nanos)方法分析④. parkUntil(Object blocker,long deadline)方法 和 parkUntil(long deadl原创 2021-05-12 22:25:32 · 186 阅读 · 0 评论 -
AtomicInteger原子类---JDK1.8源码分析
AtomicInteger原子类一. AtomicInteger介绍二. AtomicInteger源码分析①. AtomicInteger主要属性②. AtomicInteger两个构造方法③. compareAndSet()和weakCompareAndSet方法④. getAndIncrement()和getAndDecrement()方法⑤. set()和lazySet() 方法分析⑥. getAndUpdate()和updateAndGet() 方法分析三. AtomicInteger优缺点一.原创 2021-05-12 20:55:09 · 275 阅读 · 0 评论 -
ReentrantLock---JDK1.8源码分析
ReentrantLock源码分析---JDK1.8一. ReentrantLock的底层实现方式二. ReentrantLock源码分析①. ReentrantLock内部类②. Sync源码分析③. NonfairSync源码分析---非公平锁1. 调用非公平锁实现的tryAcquire()方法2. Sync内部类中的nonfairTryAcquire() 方法④. FairSyn源码分析---公平锁1. 执行AQS的acquire() 方法后 调用FairSync重写的 tryAcquire()原创 2021-05-11 12:50:11 · 163 阅读 · 0 评论 -
CAS无锁算法和解决ABA问题---JDK1.8源码分析
CAS详细分析和ABA问题一. CAS详细分析二. ABA问题①. ABA问题介绍②. ABA问题解决方法1. AtomicStampedReference类源码分析2. AtomicMarkableReference类一. CAS详细分析展示三个CAS方法,都是native方法二. ABA问题①. ABA问题介绍ABA问题的根本在于CAS在修改变量的时候,无法记录变量的状态,比如修改的次数,否修改过这个变量。这样就很容易在一个线程将A修改成B时,另一个线程又会把B修改成A,造成CA原创 2021-04-30 08:39:26 · 341 阅读 · 0 评论 -
ThreadLocal和ThreadLocalMap---JDK1.8源码分析
ThreadLocal和ThreadLocalMap源码分析---JDK1.8一. ThreadLocal源码分析①. 核心属性②. get()方法③. setInitialValue()④. createMap() 和getMap()方法⑤. set()方法⑥. remove() 方法二. ThreadLocalMap源码分析①. Entry内部类②. 核心属性③. ThreadLocalMap构造函数④. getEntry()方法 获取Entry⑤. getEntryAfterMiss()⑥. expu原创 2021-04-29 17:48:39 · 232 阅读 · 0 评论 -
Java基础知识---TreadLocal原理简单分析
TreadLocal原理简单分析1. TreadLocal源码介绍2. ThreadLocal中的set()方法分析3.ThreadLocalMap内部Entry造成内存泄漏问题(OOM)4. ThreadLocal作用体现方式5. TreadLocal基本数据类型测试线程隔离6. TreadLocal测试全局引用和局部引用的区别1. TreadLocal源码介绍ThreadLocal提供了一种访问某个变量的特殊方式:访问到的变量属于当前线程,即保证每个线程的变量不一样,而同一个线程在任何地方拿到的原创 2021-03-02 21:38:20 · 445 阅读 · 1 评论 -
Volatile---Volatile关键字简单介绍
volatile关键字一. 并发的三要素1. 原子性2. 可见性3. 有序性二. Volatile1.保证多线程下的可见性2.禁止进行指令重排序(即保证有序性)3.volatile不能保证原子性三. volatile和synchronized的区别一. 并发的三要素1. 原子性原子性特性的操作是不可中断的,要么全部执行成功要么全部执行失败只有简单的读取、赋值才是原子操作。而且必须是将数字赋值给某个变量,变量之间的相互赋值不是原子操作比如:i = 2;j = i;i++;i = i原创 2021-03-07 16:07:39 · 245 阅读 · 0 评论