
并发编程
文章平均质量分 62
yakax
这个作者很懒,什么都没留下…
展开
-
FutureTask源码学习
FutureTask原创 2021-01-22 13:36:47 · 176 阅读 · 0 评论 -
ConcurrentHashMap源码学习
ConcurrentHashMap原创 2021-01-22 13:36:13 · 248 阅读 · 0 评论 -
ThreadPoolExecutor源码学习
属性字段说明//高3位:表示当前线程池运行状态 除去高3位之后的低位:表示当前线程池中所拥有的线程数量 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); //表示在ctl中,低COUNT_BITS位 是用于存放当前线程数量的位。 private static final int COUNT_BITS = Integer.SIZE - 3; //低COUNT_BITS位 所能表达原创 2021-01-22 13:35:29 · 109 阅读 · 0 评论 -
ReentrantLock + AQS源码学习
ReentrantLockAQS原创 2021-01-22 13:34:54 · 106 阅读 · 0 评论 -
AQS应用工具类源码学习
- CountDownLatch - CyclicBarrier - Semaphore原创 2021-01-22 13:34:17 · 102 阅读 · 0 评论 -
ThreadLocal源码学习
基本结构图片每个Thread 维护一个 ThreadLocalMap 映射表,这个映射表的 key 是 ThreadLocal实例本身,value 是真正需要存储的 Object所以ThreadLocal只有key的引用在 每个线程里面也就是说 ThreadLocal 本身并不存储值,它只是作为一个 key 来让线程从 ThreadLocalMap 获取 value真正存数据的是Thread 的局部变量 threadLocals 的ThreadLocalMap里面的entry对象的value原创 2021-01-22 13:33:38 · 115 阅读 · 0 评论 -
Condition源码学习
总体Condition产生的图signal() 唤醒队列是从condition阻塞队列取第一个 ,不过是放进AQS队列的队尾, 并且入队后会判断是否需要挂起condition队列node 进入AQS队列后 会判断上一个节点是否为head节点 然后尝试加锁 否则依然会挂起condition队列的node状态是CONDITION=-2await是会阻塞当前线程并且会完全释放锁,然后唤醒AQS头结点来获取锁。也就是阻塞在lock外面的线程。condition队列存储的就是曾经获取到锁,但是awai原创 2021-01-22 13:33:06 · 161 阅读 · 0 评论 -
SynchronousQueue源码学习
SynchronousQueue 是实现了BlockingQueue的一个队列。特点是SynchronousQueue 没有容器。在生产者消费者情况下。生产者生产数据后没人消费是会阻塞的。当有消费者消费了,消费者与生产者同时退出队列。SynchronousQueue 的两种实现方式公平模式 就是队列 TransferQueue非公平模式 就是栈 TransferStackTransferer 抽象类不管非公平还是公平都是这个抽象方法来实现的数据交换abstract static.原创 2021-01-22 13:32:36 · 163 阅读 · 0 评论 -
LongAdder源码学习
LongAdder 更适合做全局计数统计。而AtomicLong适合做自增,因为他能累加并实时返回值,而LongAdder统计的值时近实时。AtomicLong 由于一直通过cas自旋修改值,在高并发情况下会有很多线程处于自旋,而LongAdder 利用空间换时间的方式把要增加的值先放另一边。原创 2020-09-29 14:51:56 · 116 阅读 · 0 评论 -
并发编程学习(6)CountDownLatch、Semaphore、CyclicBarrier
CountDownLatchcountdownlatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行,countdownlatch 提供了两个方法,一个是 countDown,一个是 await。countdownlatch 初始化的时候需要传入一个整数,在这个整数倒数到 0 之前,调用了 await 方法的程序都必须要等待,然后通过 countDown 来...原创 2020-02-19 21:44:03 · 217 阅读 · 0 评论 -
并发编程学习(5)Condition
Condition在前面学习 synchronized 的时候,有wait/notify 的基本使用,结合 synchronized 可以实现对线程的通信。那么,既然 J.U.C 里面提供了锁的实现机制,那 J.U.C 里面应该也有提供线程通信的机制,Condition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒。测试代...原创 2020-02-19 21:41:16 · 313 阅读 · 0 评论 -
并发编程学习(4)Lock
初步认识JUCJava.util.concurrent 是在并发编程中比较常用的工具类,里面包含很多用来在并发场景中使用的组件。比如线程池、阻塞队列、计时器、同步器、并发集合等等。并发包的作者是大名鼎鼎的 Doug Lea。lock在 Lock 接口出现之前,Java 中的应用程序对于多线程的并发安全处理只能基于synchronized 关键字来解决。但是 synchronized 在有些场...原创 2020-02-19 21:38:56 · 390 阅读 · 0 评论 -
并发编程学习(3)线程安全性分析
初步认识 Volatile public /*volatile*/ static boolean stop=false; public static void main( String[] args ) throws InterruptedException { Thread t1=new Thread(()->{ int i=0; ...原创 2020-02-19 21:36:00 · 202 阅读 · 0 评论 -
并发编程学习(2)synchronized与锁的唤醒
synchronized 的基本认识在多线程并发编程中 synchronized 一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着 Java SE 1.6 对synchronized 进行了各种优化之后,有些情况下它就并不那么重,Java SE 1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁。synchronized 的基本语法synchronized 有三种...原创 2020-02-19 21:31:04 · 1853 阅读 · 0 评论 -
并发编程学习(1)线程的创建、启动、停止
单核cpu执行程序的流程有了进程以后,可以让操作系统从宏观层面实现多应用并发。而并发的实现是通过 CPU 时间片不端切换执行的。对于单核 CPU 来说,在任意一个时刻只会有一个进程在被CPU 调度线程的出现在多核 CPU 中,利用多线程可以实现真正意义上的并行执行在一个应用进程中,会存在多个同时执行的任务,如果其中一个任务被阻塞,将会引起不依赖该任务的任务也被阻塞。通过对不同任务创...原创 2020-02-19 21:21:56 · 331 阅读 · 0 评论