摘要:
JDK 动态代理 代理模式是常用的 JAVA 设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调 阅读全文
摘要:
基础知识: 线程:https://www.cnblogs.com/youngao/p/12568580.html 并发基础:https://www.cnblogs.com/youngao/p/12558381.html CAS:https://www.cnblogs.com/youngao/p/12 阅读全文
摘要:
1. 简介 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。 两个附加的操作。 支持阻塞的 插入 方法,在队列为空时,获取元素的线程会等待队列变为非空。 支持阻塞的 移除 方法,当队列满时,存储元素的线程会等待队列可用。 阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元 阅读全文
摘要:
1. 简介 Exchanger(交换者)是自 JDK 1.5 起开始提供的工具套件,源于 java.util.concurrent 包。 是一个用于线程间协作的工具类。 Exchanger 用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。 此类提供对外的操作是同步 阅读全文
摘要:
1. 简介 Semaphore 类是一个计数信号量,必须由获取它的线程释放, 通常用于限制可以访问某些资源(物理或逻辑的)线程数目。 一个信号量有且仅有 3 种操作,且它们全部是原子的。 初始化、增加和减少。 增加可以为一个进程解除阻塞。 减少可以让一个进程进入阻塞。 Semaphore 管理一系列 阅读全文
摘要:
1. ConcurrentLinkedQueue 在并发编程中有时候需要使用线程安全的队列,线程安全队列有两种实现方式。 阻塞方式:对入队和出队操作加锁,阻塞队列。 非阻塞方式:通过自旋 CAS 实现,例如:ConcurrentLinkedQueue。 在中等规模的并发场景下,ConcurrentL 阅读全文
摘要:
1. ConcurrentHashMap 1.1 HaspMap(JDK 1.8) JDK 1.8 HashMap JDK 1.8 对 HashMap 进行了修改,最大的不同就是利用了红黑树,其由数组+链表+红黑树组成。 JDK 1.7 中,查找元素时,根据 hash 值能够快速定位到数组的具体下标 阅读全文
摘要:
1. ConcurrentHashMap ConcurrentHashMap 是线程安全且高效的 HashMap。 多线程环境下,使用 HashMap 进行 put 操作会引起死循环,如下例,导致 CPU 利用率接近 100%,所以在并发情况下不能使用 HashMap。 public static 阅读全文
摘要:
1. ReentrantReadWriteLock 概述 ReentrantReadWriteLock 是 Lock 的另一种实现方式,ReentrantLock 是一个排他锁,同一时间只允许一个线程访问,而 ReentrantReadWriteLock 允许多个读线程同时访问,但不允许写线程和读线 阅读全文
摘要:
1. LockSupport LockSupport 是用来创建锁和其他同步类的基本线程阻塞原语。 是一个简单的代理类,里面的代码都是使用 Unsafe 类里面的方法。 JDK 对 LockSupport 的描述:Basic thread blocking primitives for creati 阅读全文
摘要:
锁是用来控制多个线程访问共享资源的方式。 Java 程序可以使用 syschronized 关键字实现锁功能,而 Java 5 之后,在并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能。 Lock 提供了与 syschronized 关键字类似的同步功能,只是在使用时需要 显式地获取和 阅读全文