随笔分类 -  JUC

摘要:简介 在并发编程中,有时候需要使用线程安全的队列。 要实现一个线程安全的队列有两种方式: 1. 阻塞算法; 阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。 2. 非阻塞算法。 非阻塞的实现方式则可以使用循环CAS的方式来实现。 JUC中非阻塞队列有C 阅读全文
posted @ 2020-01-06 20:57 王大军 阅读(809) 评论(0) 推荐(0)
摘要:前言 在JDK的并发包里提供了几个非常有用的并发工具类。 提供并发流程控制的工具类 CountDownLatch,CyclicBarrier,Semaphore 提供了在线程间交换数据的工具类 Exchanger 等待多线程完成的CountDownLatch CountDownLatch允许一个或多 阅读全文
posted @ 2020-01-05 21:58 王大军 阅读(229) 评论(0) 推荐(0)
摘要:前言 我们知道Queue是一种具有FIFO特点的数据结构,元素只能在队首进行“入队”操作,在队尾进行“出队”操作。 而Deque(double-ended queue)这种数据结构,是一种双端队列,也就是说可以在任意一端进行 “入队”,也可以在任意一端进行 “出队”: Queue接口定义: 它的接口 阅读全文
posted @ 2020-01-04 14:38 王大军 阅读(383) 评论(0) 推荐(0)
摘要:一、简介 CopyOnWriteArrayList简介 ArrayList是一种 “列表” 数据结构,其底层是通过数组来实现元素的随机访问。JDK1.5之前,如果想要在并发环境下使用 “列表”,一般有以下3种方式: 1. 使用Vector类 2. 使用Collections.synchronized 阅读全文
posted @ 2020-01-03 20:33 王大军 阅读(297) 评论(0) 推荐(0)
摘要:一、ConcurrentSkipListMap简介 ConcurrentSkipListMap是线程安全的有序的哈希表,适用于高并发的场景 ConcurrentSkipListMap和TreeMap,它们虽然都是有序的哈希表。但是 1. 它们的线程安全机制不同,TreeMap是非线程安全的,而Con 阅读全文
posted @ 2020-01-03 16:11 王大军 阅读(253) 评论(0) 推荐(0)
摘要:一、扩容的基本思路 JDK1.8中,ConcurrentHashMap最复杂的部分就是扩容/数据迁移,涉及多线程的合作和rehash。 扩容思路 Hash表的扩容包含的两个步骤: ① table数据的扩容 table数组的扩容,一般就是新建一个2倍大小的桶数组,这个过程通过一个单线程完成,且不允许出 阅读全文
posted @ 2020-01-02 21:36 王大军 阅读(491) 评论(0) 推荐(0)
摘要:一、ConcurrentHashMap类简介 ConcurrentHashMap是一个同步集合工具类,是一个线程安全的HashMap。不同版本的ConcurrentHashMap,内部实现机制千差万别。最大的变化在JDK1.8。 本节讨论的基于JDK1.8。 ConcurrentHashMap类的继 阅读全文
posted @ 2020-01-02 11:00 王大军 阅读(319) 评论(0) 推荐(0)
摘要:一、简介 StampedLock类,在JDK1.8时引入,是对读写锁ReentrantReadWriteLock的增强,该类提供了一些功能,优化了读锁,写锁的访问,同时是读写锁之间可以互相转换,更细粒度控制并发。 首先明确下,该类的设计初衷是作为一个内部工具类,用于辅助开发其他线程安全组件,用得好, 阅读全文
posted @ 2020-01-01 21:30 王大军 阅读(366) 评论(0) 推荐(0)
摘要:一、前言 LockSupport工具类用于阻塞或唤醒线程。LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程组阻塞和唤醒功能,而LockSupport也成为构建同步组件的基础工具。 LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thr 阅读全文
posted @ 2019-12-30 21:38 王大军 阅读(264) 评论(0) 推荐(0)
摘要:读写锁简介 对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写操作了。 读写锁ReentrantReadWriteLock,它表示两 阅读全文
posted @ 2019-12-30 17:01 王大军 阅读(222) 评论(0) 推荐(1)
摘要:前言 ReentrantLock即可重入锁,实现了Lock和Serializable接口 在java环境下ReentrantLock和Synchronized都是可重入锁 ReentrantLock构造函数中提供两种锁:创建公平锁和非公平锁(默认) ReentrantLock有三个内部类 Sync、 阅读全文
posted @ 2019-12-30 13:29 王大军 阅读(300) 评论(0) 推荐(0)
摘要:1. 简介 AbstractQueuedSynchronizer (抽象队列同步器,以下简称 AQS)出现在 JDK 1.5 中,由大师 Doug Lea 所创作。AQS 是很多同步器的基础框架。 ReentrantLock、CountDownLatch 和 Semaphore 等都是基于 AQS 阅读全文
posted @ 2019-12-04 10:29 王大军 阅读(535) 评论(1) 推荐(0)
摘要:在分析原子类之前,先来了解CAS操作 CAS CAS,compare and swap的缩写,中文翻译成比较并交换。 CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。 无 阅读全文
posted @ 2019-12-03 09:36 王大军 阅读(348) 评论(0) 推荐(0)