随笔分类 - JDK源码
摘要:一、类加载机制 启动类加载器(Bootstrap ClassLoader):这个类加载器负责加载 JAVA_HOME/lib 目录。 扩展类加载器(Extension ClassLoader):这个类加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载JAVA_H
阅读全文
摘要:如果你尝试修改Arrays.asList方法生产的List,那么就会报这个错误 public static void main(String[] args) { Integer[] arr = new Integer[]{7,8,9}; List<Integer> list = Arrays.asL
阅读全文
摘要:在Java中,但凡你尝试在Collection下面的集合循环语句中新增/删除元素的时候,都会报错:java.util.ConcurrentModificationException Map public static void main(String[] args) { class User{ pr
阅读全文
摘要:HashSet 先看一下成员变量 // 由此可见内部存储是一个HashMap private transient HashMap<E,Object> map; private static final Object PRESENT = new Object(); public HashSet() {
阅读全文
摘要:JDK SPI机制 SPI(Service Provider Interface),是一种将服务接口与服务实现分离以达到解耦可拔插、大大提升了程序可扩展性的机制。 约定(我觉得称之为规范更合适): 1. 制定统一的规范(比如 java.sql.Driver) 2. 服务提供商提供这个规范具体的实现,
阅读全文
摘要:基本用法 class Job{ private ReentrantLock lock = new ReentrantLock(); // 共享变量 private String data = null; /** * 临界方法 */ public void deal(){ // 加锁 lock.loc
阅读全文
摘要: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方法不是一个常量时间操作。由于这些队列的异步性,确定当前元素的数量需要遍历元素,因此如果在遍
阅读全文
摘要:ArrayBlockingQueue 功能 全名 简述 由数组支持的有界阻塞队列。这个队列对元素FIFO(先进先出)排序。队列的头是队列中存在时间最长的元素。队列的尾部是队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作获取队列头部的元素。 这是一个典型的“有界缓冲区”,其中大小固定的数
阅读全文
摘要:CopyOnWriteArrayList 功能 全名 简述 ArrayList的线程安全变体,其中所有的可变操作(添加、修改等)都是通过创建底层数组的新副本来实现的。 方法 原理 add addIfAbsent remove get 优缺点 优点:根据数据结构和实现逻辑,这个适合“读多写少”的场景。
阅读全文
摘要:ArrayList 功能 完全命名 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable 简介 实现List接口的可调整大小的数组,这是个
阅读全文
摘要:一个简单知识点,List和Set都是继承Collection接口,HashMap实现了Map接口,而这两个顶级接口的实现类都有哪些呢? Collection<E> 子接口:BlockingDeque<E>, BlockingQueue<E>, Deque<E>, List<E>, Navigable
阅读全文
摘要:设置同步状态,利用CAS操作。 进入tryLock,实际上是非公平锁的实现(非公平锁:不能保证正在排队的线程能拿到锁,因为可能被新来的线程抢走) 进入lock,实际上是公平锁的实现(公平锁:老的线程在排队,新来的线程也一样要排队,不能抢占) tryLock和lock不同点 1. tryLock不管拿
阅读全文