死磕Java并发
Elon0
这个作者很懒,什么都没留下…
展开
-
【死磕Java并发】----- 死磕 Java 并发精品合集
【死磕Java并发】—–深入分析synchronized 的实现原理synchronized 可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。深入分析 synchronized 的内在实现机制,锁优化、锁升级过程。【死磕Java并发】—–深入分析volatile的实现原理volatile 可以保证线程可见性且提供了一定的有序...转载 2019-09-27 00:58:06 · 160 阅读 · 1 评论 -
【死磕Java并发】—–J.U.C之Condition
原文出处:http://cmsblogs.com/ 『chenssy』此篇博客所有源码均来自JDK 1.8在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait()、notify()系列方法可以实现等待/通知模式。在Java SE5后,Java提供了Lock接口,相对于Synchronized而言,Lock提供了条件Condition,对线程的等待、唤醒...转载 2019-09-14 19:03:12 · 211 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之ConcurrentHashMap红黑树转换分析
红黑树先看红黑树的基本概念:红黑树是一课特殊的平衡二叉树,主要用它存储有序的数据,提供高效的数据检索,时间复杂度为O(lgn)。红黑树每个节点都有一个标识位表示颜色,红色或黑色,具备五种特性:每个节点非红即黑根节点为黑色每个叶子节点为黑色。叶子节点为NIL节点,即空节点如果一个节点为红色,那么它的子节点一定是黑色从一个节点到该节点的子孙节点的所有路径包含相同个数的黑色节点请牢记这五...转载 2019-09-16 23:16:15 · 172 阅读 · 0 评论 -
ThreadLocal简单概括
什么是ThreadLocal结合我的总结可以这样理解:ThreadLocal提供了线程的局部变量,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离~。简要言之:往ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal原理总结每个Thread维护着一个ThreadLoca...转载 2019-09-20 17:48:52 · 89 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之AQS:AQS简介
AQS工作原理概要AbstractQueuedSynchronizer又称为队列同步器(后面简称AQS),它是用来构建锁或其他同步组件的基础框架,AQS的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态。内部通过一个int类型的成员变量state来控制同步状态,当state=0时,则说明没有任何线程占有共享资源的锁,当state=1时,则说明有线程目前正在使用共享变量...转载 2019-09-25 23:00:54 · 152 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之AQS:CLH同步队列
CLH同步队列是一个FIFO双向队列,AQS依赖它来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node)并将其加入到CLH同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点唤醒(公平锁),使其再次尝试获取同步状态。在CLH同步队列中,一个节点表示一个线程,它保存着线程的引用(thread)、状态(waitStatus)、前...转载 2019-09-25 23:10:35 · 119 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之AQS:同步状态的获取与释放
Table of Contents独占式独占式同步状态获取独占式获取响应中断独占式超时获取独占式同步状态释放共享式共享式同步状态获取共享式同步状态释放AQS的设计模式采用的模板方法模式,子类通过继承的方式,实现它的抽象方法来管理同步状态,对于子类而言它并没有太多的活要做,AQS提供了大量的模板方法来实现同步,主要是分为三类:独占式获取和释放同步状态、共享式获取和...转载 2019-09-25 23:37:54 · 227 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之AQS:阻塞和唤醒线程
Table of ContentsLockSupport在线程获取同步状态时如果获取失败,则加入CLH同步队列,通过通过自旋的方式不断获取同步状态,但是在自旋的过程中则需要判断当前线程是否需要阻塞,其主要方法在acquireQueued():if (shouldParkAfterFailedAcquire(p, node) && ...转载 2019-09-26 00:01:12 · 205 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之阻塞队列:PriorityBlockingQueue
我们知道线程Thread可以调用setPriority(int newPriority)来设置优先级的,线程优先级高的线程先执行,优先级低的后执行。而前面介绍的ArrayBlockingQueue、LinkedBlockingQueue都是采用FIFO原则来确定线程执行的先后顺序,那么有没有一个队列可以支持优先级呢? PriorityBlockingQueue 。PriorityBlockin...转载 2019-09-27 00:30:43 · 98 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之阻塞队列:DelayQueue
Table of ContentsDelayQueueDelayed内部结构offer()take()DelayQueue是一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行。也就是说只有在延迟期到时才能够从队列中取元素。DelayQueue主要用于两...转载 2019-09-27 00:30:52 · 89 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之阻塞队列:SynchronousQueue
【注】:SynchronousQueue实现算法看的晕乎乎的,写了好久才写完,如果当中有什么错误之处,忘各位指正作为BlockingQueue中的一员,SynchronousQueue与其他BlockingQueue有着不同特性:SynchronousQueue没有容量。与其他BlockingQueue不同,SynchronousQueue是一个不存储元素的BlockingQueue。每一...转载 2019-09-27 00:31:01 · 96 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之阻塞队列:LinkedBlockingDeque
Table of ContentsLinkedBlockingDeque基础方法前面的BlockingQueue都是单向的FIFO队列,而LinkedBlockingDeque则是一个由链表组成的双向阻塞队列,双向队列就意味着可以从对头、对尾两端插入和移除元素,同样意味着LinkedBlockingDeque支持FIFO、FILO两种操作方式。LinkedBlockingDeque...转载 2019-09-27 00:31:09 · 99 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之线程池:ThreadPoolExecutor
Table of Contents内部状态创建线程池线程池任务提交线程终止作为Executor框架中最核心的类,ThreadPoolExecutor代表着鼎鼎大名的线程池,它给了我们足够的理由来弄清楚它。下面我们就通过源码来一步一步弄清楚它。内部状态线程有五种状态:新建,就绪,运行,阻塞,死亡,线程池同样有五种状态:Running, SHUTDOWN, STOP...转载 2019-09-27 00:31:24 · 95 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之线程池:ScheduledThreadPoolExecutor
Table of ContentsScheduledThreadPoolExecutor解析在上篇博客【死磕Java并发】—–J.U.C之线程池:ThreadPoolExecutor已经介绍了线程池中最核心的类ThreadPoolExecutor,这篇就来看看另一个核心类ScheduledThreadPoolExecutor的实现。ScheduledThreadPoolExecutor...转载 2019-09-27 00:31:33 · 84 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之阻塞队列:ArrayBlockingQueue
ArrayBlockingQueue,一个由数组实现的有界阻塞队列。该队列采用FIFO的原则对元素进行排序添加的。ArrayBlockingQueue为有界且固定,其大小在构造时由构造函数来决定,确认之后就不能再改变了。ArrayBlockingQueue支持对等待的生产者线程和使用者线程进行排序的可选公平策略,但是在默认情况下不保证线程公平的访问,在构造时可以选择公平策略(fair = tr...转载 2019-09-27 00:30:32 · 71 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之Java并发容器:ConcurrentSkipListMap
Table of ContentsSkipListSkipList的特性SkipList的查找SkipList的插入SkipList的删除ConcurrentSkipListMapput操作get操作remove操作size操作到目前为止,我们在Java世界里看到了两种实现key-value的数据结构:Hash、TreeMap,这两种数据结构各自都有着优...转载 2019-09-26 13:54:06 · 118 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之Java并发容器:ConcurrentLinkedQueue
要实现一个线程安全的队列有两种方式:阻塞和非阻塞。阻塞队列无非就是锁的应用,而非阻塞则是CAS算法的应用。下面我们就开始一个非阻塞算法的研究:CoucurrentLinkedQueue。ConcurrentLinkedQueue是一个基于链接节点的无边界的线程安全队列,它采用FIFO原则对元素进行排序。采用“wait-free”算法(即CAS算法)来实现的。CoucurrentLinked...转载 2019-09-26 13:51:35 · 112 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之Java并发容器:ConcurrentHashMap
Table of ContentsConcurrentHashMap的实现重要概念重要内部类NodeTreeNodeTreeBinForwardingNode构造函数初始化: initTable()put操作get操作size 操作扩容操作转换红黑树HashMap是我们用得非常频繁的一个集合,但是由于它是非线程安全的,在多线程环境下,pu...转载 2019-09-26 13:06:46 · 172 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之并发工具类:Semaphore
Table of Contents实现分析信号量获取信号量释放应用示例信号量Semaphore是一个控制访问多个共享资源的计数器,和CountDownLatch一样,其本质上是一个“共享锁”。Semaphore,在API是这么介绍的:一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 rel...转载 2019-09-26 12:55:06 · 83 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之并发工具类:CountDownLatch
Table of Contents实现分析await()countDown()总结应用示例在上篇博客中介绍了Java四大并发工具一直的CyclicBarrier,今天要介绍的CountDownLatch与CyclicBarrier有点儿相似。CyclicBarrier所描述的是“允许一组线程互相等待,直到到达某个公共屏障点,才会进行后续任务”,而CountDownLat...转载 2019-09-26 12:44:10 · 85 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之并发工具类:CyclicBarrier
Table of Contents实现分析应用场景应用示例CyclicBarrier,一个同步辅助类,在API中是这么介绍的:它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称...转载 2019-09-26 12:37:59 · 106 阅读 · 0 评论 -
【死磕Java并发】—-深入分析CAS
Table of ContentsCAS分析CAS缺陷CAS,Compare And Swap,即比较并交换。Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作。整个AQS同步组件、Atomic原子类操作等等都是以CAS实现的,甚至ConcurrentHashMap在1.8的版本中也调整为了CAS+Synchronized。可以说CAS是整个JU...转载 2019-09-26 12:19:28 · 102 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之重入锁:ReentrantLock
Table of Contents获取锁释放锁公平锁与非公平锁ReentrantLock与synchronized的区别简单总结:lock方法调用sync.lock(),Sync为ReentrantLock里面的一个内部类,它继承AQS,它有两个子类:公平锁FairSync和非公平锁NonfairSync。默认实现了nonfairTryAcquire(int acquir...转载 2019-09-26 09:49:41 · 130 阅读 · 0 评论 -
【死磕Java并发】—–J.U.C之并发工具类:Exchanger
Table of Contents应用示例实现分析前面三篇博客分别介绍了CyclicBarrier、CountDownLatch、Semaphore,现在介绍并发工具类中的最后一个Exchange。Exchange是最简单的也是最复杂的,简单在于API非常简单,就一个构造方法和两个exchange()方法,最复杂在于它的实现是最复杂的(反正我是看晕了的)。在API是这么介绍的:可以...转载 2019-09-26 12:58:01 · 139 阅读 · 0 评论