摘要:
基本用法 class Job{ private ReentrantLock lock = new ReentrantLock(); // 共享变量 private String data = null; /** * 临界方法 */ public void deal(){ // 加锁 lock.loc 阅读全文
摘要:
首先你要引入依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.0.RELEASE</version> </dependency> 然后 阅读全文
摘要:
建立个实体类 import lombok.Getter; import lombok.Setter; import lombok.ToString; @Getter @Setter @ToString public class Book { private String name; public B 阅读全文
摘要:
Future 从JDK1.5开始,提供了Future来表示异步计算的结果,一般它需要结合ExecutorService(执行者)和Callable(任务)来使用。 示例 输出 即使异步任务等待了5秒,也依然先于消息输出,由此证明get方法是阻塞的。 Future只是个接口,实际上返回的类是Futur 阅读全文
摘要:
先看一下大体结构 ThreadLocal(线程本地变量),作用是让每个线程都维护一份独立的变量副本,解决了变量并发访问冲突的问题。表面上看,变量是存储在ThreadLocal里面的,实则不然:1. ThreadLocal只是个“工具类”,对外暴露了get、set、remove接口;2. 内部实现:变 阅读全文
摘要:
ConcurrentHashMap 内部结构 在JDK1.8之前的实现结构是:ReentrantLock+Segment+HashEntry+链表 JDK1.8之后的实现结构是:synchronized+CAS+Node+链表或红黑树(与HashMap一致) 而1.8之前锁的是Segment,1.8 阅读全文
摘要:
HashMap 内部结构 内部是一个Node数组,每个Node都是链表的头,当链表的大小达到8之后链表转变成红黑树。 put操作 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node< 阅读全文
摘要:
CountDownLatch 众所周知,它能解决一个任务必须在其他任务完成的情况下才能执行的问题,代码层面来说就是只有计数countDown到0的时候,await处的代码才能继续向下运行,例如: 运行结果: 源码 实际上内部十分简单,里面只有一个AQS的子类 下面看具体做了什么事情 先来看await 阅读全文
摘要:
线程安全可以概括为三个方面:原子性、可见性和有序性。 原子性:对于涉及共享变量的操作看做一个整体,在同一时间内,只能由一个线程执行,在其它线程看来,这部分操作要么尚未开始,要么已经完成。Java中,基本类型除了long和double,其它类型变量的写操作都是原子性的。 可见性:一个线程修改了共享变量 阅读全文
摘要:
LinkedTransferQueue 功能 全名 简述 基于链表的的无界队列。队列的头是某个生产者在队列中停留时间最长的元素。队列的尾部是某个生产者在队列中时间最短的元素。 注意,与大多数集合不同,size方法不是一个常量时间操作。由于这些队列的异步性,确定当前元素的数量需要遍历元素,因此如果在遍 阅读全文