
java 线程知识
文章平均质量分 82
pure2holy
感恩,净化自己
展开
-
AQS应用-信号量,倒计时锁存器,循环屏障
Semaphore 、CountDownLatch 与 CyclicBarrier 是AQS的另一种应用;我们分别研究三者是如何实现的。SemaphoreSemaphore信号量,可以理解为操作系统中PV原语的java实现;实际上是用AQS的共享变量实现的;如何构造一个Semaphore初始化一个信号量,指定许可的资源数量;默认实现非公平的许可 /** * Creates a {@code Semaphore} with the given number of * pe原创 2021-12-13 14:57:03 · 276 阅读 · 0 评论 -
AQS的应用-锁
在前三篇文章中,我们已经考察了同步队列与条件队列的创建,入队,出队,取消,与转移过程;这一篇文章,我们来考察AQS的应用;文章目录ReentrantLock如何创建一个重入锁对象如何实现锁定公平锁与非公平锁的区别独占,与重入总结如何释放锁独占模式下,唤醒后继者何时头节点为0独占模式唤醒后继者源码分析总结ReentrantReadWriteLock读写锁简介读写锁类结构公平与非公平同步器读锁与写锁的实现如何构造一个读锁/写锁读写锁如何实现锁定与解锁的背后原理读写锁如何实现重入计数的读锁与写锁阻塞与释放写锁获原创 2021-12-10 16:01:12 · 553 阅读 · 0 评论 -
AQS条件队列的创建,入队及出队
这时AQS的第三篇文章,在第二篇文章中,我们分析了同步队列的入队与出队,在第三盘文章中,我们去分析条件队列的创建,入队,出队。文章目录ConditionObject 介绍条件队列的创建,入队出队清理取消的节点节点转移到同步队列前的出队等待节点的取消转移总结ConditionObject 介绍条件对象,在MESA模型中,条件对象可以有多个,每个条件对象都有一个对应的条件队列;当调用wait方法时,添加到条件队列;调用notify方法时,从条件队列转移到同步队列;在java中,ConditionObj原创 2021-12-09 13:33:56 · 753 阅读 · 0 评论 -
AQS 同步队列创建,入队,出队与取消
这是AQS 解读的第二篇,着重介绍同步队列的创建与操作;参见第一篇,同步队列在管程入口处;AQS构建的同步队列是一个双向链表;文章目录AbstractQueuedSynchronizer中的属性同步队列创建与入队入队总结为什么入队,以及入队后发生了什么?acquire资源入队独占模式获取共享模式获取何时park线程条件队列入同步队列transferForSignal 收到信号而转移transferAfterCancelledWait 取消await后转移同步队列出队获取资源的出队操作取消正在获取的节点总结原创 2021-12-08 18:38:23 · 736 阅读 · 0 评论 -
AQS Node解析
本文作为解析AQS文章的第一篇,着重介绍队列元素的Node的实现。java线程间通信方式java线程间通信方式,有volatile基于可见内存可见性实现的通信,有管道PipedOutputStream,PipedInputStream 基于内存传递实现的通信,有等待通知机制实现的wait,notify,join等方式;实际等待通知机制也是基于共享内存实现的;这里引入一个管程 monitor 的概念,管程是指管理共享变量以及对共享变量的操作的过程。java关键字 synchronized 就是基于MESA原创 2021-12-08 13:28:10 · 461 阅读 · 0 评论 -
LongAdder理解
LongAdder是对Long类型字段进行多线程累加的工具类,在线程竞争较多后,LongAdder比AutomicLong更有效率;AutomicLong 当调用自增方法时,是使用cas + 自旋的方式 实现的;相对慢的原因是,仅对 valueoddSet 进行操作; public final long incrementAndGet() { return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L; } public原创 2021-12-02 14:38:30 · 485 阅读 · 0 评论 -
AQS 从后往前遍历寻找继任者
在阅读AQS源码的过程中,也许会存在这样的困惑,为什么当next指针对应的节点为null 或者取消时,从tail 向前遍历寻找最近的一个非取消的节点;当前任释放时,需要获取继任者;获取继任者时需要避免与新来的竞争者竞争;AQS的实现方式是从tail 向前遍历,之所以这样是与入队时的逻辑有关;见注释 /** * Inserts node into queue, initializing if necessary. See picture above. * @param node原创 2020-12-29 15:21:48 · 992 阅读 · 0 评论 -
理解 ThreadLocal 内存溢出
我们知道每一个线程都有一个 名为 threadLocals 的 ThreadLocalMap 对象,而且这个名字的仅有一个;它就是一个 map 对象,我们知道 map 对象是存储键值对的;这个map 的键 就是弱引用化的 ThradLocal 对象,值 就是我们调用 thradlocal.set() 方法存储的值;所以一个线程的生命周期内,可以跨越过很多个方法,可以拥有过 n 多个 threadLocal对象,他们都可以向 线程自己的 threadLocals 这个 map 对象中存储值;以上,只是对原创 2020-12-22 16:33:49 · 276 阅读 · 0 评论 -
jmm的认识与内存屏障的看法
什么是 jmm?jmm,java内存模型;为了屏蔽不同系统及硬件的差异,java 虚拟机规范定义的线程并发时内存访问模型;jmm从内存分配上,将内存虚拟的分为每个线程独有的工作线程,与共有的主线程;每个线程之间不能访问别的线程中的内存;从内存交互上定义了8种原子的 lock、unlock、read、load、use、assign、store、write 内存交互操作;从内存访问安全特性上说;1、原子性:对于简单的基本类型的赋值操作 比如 int i = 10,是原子操作;而对于 i = j ,则不是原创 2020-10-12 18:50:37 · 419 阅读 · 1 评论 -
LockSupport的 简单理解
在学习 SynchronousQueue 时,看到了 LockSupport 这个工具类;因此写了一个demo 去理解下 unpark 与 park 的所谓的 permitpackage threads.park;import java.util.concurrent.locks.LockSupport;/** * 用于理解 park 与 UnPark * upPark 相当于免停命令,持有一次 unPark 免于下一次 park() 的叫停,但再一次 park(),将会block */原创 2020-09-28 16:01:44 · 168 阅读 · 0 评论 -
java 多线程处理任务的进度展示
如题,多线程处理一个比较耗时的任务,比如耗时为 100 * 100ms 的大的文本解析任务,可以使用多线程处理,并实时反馈任务进度;代码没有经过生产验证,只是自己想法的实现,关于线程池的知识,可以参考 传送门;package concurrent;import java.util.concurrent.*;/** * 多线程处理大任务的进度百分比 */public class ProcessRate { private static ExecutorService executor原创 2020-07-24 00:46:38 · 1874 阅读 · 0 评论 -
java wait()与sleep()
sleep()方法,属于 Thread类,表示正在执行的当前线程暂停执行,交出cpu时间,让其他线程去竞争执行;wait()方法,属于Object类,表示的是正在执行的线程交出当前对象(调用 wait()方法的对象)的独占权,让其他线程有机会执行被当前对象锁住的方法;package Threads;/** * wait 方法属于对象的, * wait 方法会释放对象的独占权,而sleep则不会 */public class TestWait { public static void原创 2020-07-22 15:10:41 · 138 阅读 · 0 评论