![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
撇不完
今天不走,明天要跑
展开
-
JAVA Condition 详解
synchronized 关键字,配合Object的wait()、notify()系列方法可以实现等待/通知模式。对于Lock,通Condition也可以实现等待/通知模式。 Condition时一个接口,其实现类是AQS中的ConditionObject Lock对象通过newCondition()方法可以获得Condition对象(其实就是ConditionObject) Lock l...转载 2019-03-05 11:44:03 · 410 阅读 · 0 评论 -
atomic包解析
Atomic包是Java.util.concurrent下的另一个专门为线程安全设计的Java包,包含多个原子操作类。这个包里面提供了一组原子变量类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入,这只...转载 2019-03-10 15:02:31 · 231 阅读 · 0 评论 -
ConcurrentLinkedQueue深度解析
并编程中,一般需要用到安全的队列,如果要自己实现安全队列,可以使用2种方式: 加锁,这种实现方式就是我们常说的阻塞队列。 使用循环CAS算法实现,这种方式实现队列称之为非阻塞队列。 使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,本节我们就来研究下ConcurrentLinkedQueue是...原创 2019-03-09 19:33:18 · 827 阅读 · 0 评论 -
CountDownLatch 实现分析及示例
CountDownLatch是一个同步的辅助类,它可以允许一个或多个线程等待,直到一组在其它线程中的操作执行完成。 一个CountDownLatch会通过一个给定的count数来被初始化。其中await()方法会一直阻塞,直到当前的count被减到0,而这个过程是通过调用countDown()方法来实现的。在await()方法不再阻塞以后,所有等待的线程都会被释放,并且任何await()的子调用...原创 2019-03-06 18:22:18 · 806 阅读 · 0 评论 -
CycBarrier深度解析和示例
现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。 CyclicBarrier可以使一定数量的线...原创 2019-03-06 17:24:19 · 742 阅读 · 0 评论 -
ConcurrentHashMap精
本文着重讲解ConcurrentHashmap的源码实现和原理,JDK8中ConcurrentHashmap摒弃了分段锁技术的实现,直接采用CAS和Synchronized保证并发更新安全性,底层采用数组+链表+红黑树的存储结构。其数据结构如下: 说明:数据结构采用数组 + 链表 + 红黑树的方式实现。当链表中的节点个数超过8个时,会转换成红黑树的数据结构存储,这样设计的目的是为了减少同一个...原创 2019-03-08 16:06:39 · 133 阅读 · 0 评论 -
AQS同步构造器
什么是AQS? AQS的核心思想是基于volatile int state这样的volatile变量,配合unsafe工具对其原子性的操作来实现堆当前锁状态的修改,同步器内部依赖一个FIFO的双向队列来完成资源获取线程的排队工作。并发控制的核心是锁的获取与释放,锁的实现方式有很多种,AQS采用的是一种改进的CLH锁。那么设么是CLH锁呢? CLH CLH(Craig, Landin, and...转载 2019-03-02 15:55:46 · 101 阅读 · 0 评论 -
ReentrantReadWriteLock精华理解
ReentrantLock在并发情况下只允许单个线程执行受保护的代码,而在大部分应用中都是读多写少,所以,如果使用ReentrantLock实现这种对共享数据的并发访问控制,将严重影响整体的性能。ReentrantReadWriteLock中提供的读取锁(ReadLock)可以实现并发访问下的多读,写入锁(WriteLock)可以实现每次只允许一个写操作。 ReentrantLock有两个锁:一...原创 2019-03-05 14:44:01 · 296 阅读 · 0 评论 -
ReentrantLock详解
在Java中通常实现锁有两种方式,一种是synchronized关键字,另一种是Lock.synchronized是基于JVM层面实现的,而Lock是基于JDK层面实现的。Lock在硬件层面依赖CPU指令,完全由Java代码完成,底层利用LockSupport类和Unsafe类进行操作;虽然锁有很多实现,但是都依赖AbstractQueuedSynchronizer类,我们用ReentrantLo...转载 2019-03-05 13:09:43 · 250 阅读 · 0 评论 -
ThreadPoolExecutor源码解析之机制原理篇
线程池可以解决两个不同问题:由于减少了每个任务的调用开销,在执行大量的异步任务时,它通常能够提供更好的性能,并且还可以提供绑定和管理资源(包括执行集合任务时使用的线程)的方法。每个 ThreadPoolExecutor还维护着一些基本的统计数据,如完成的任务数。 这是ThreadPoolExecutor文档中的说明。线程池其实就是把你提交的任务(task)进行调度管理运行,但这个调度的过程以...原创 2019-03-10 17:26:33 · 293 阅读 · 0 评论