Java
还是搬砖踏实
这个作者很懒,什么都没留下…
展开
-
【JDK源码分析】 String.join()方法解析
前言最近出于习惯问题,顺手点开了String的源码,意外发现String在JDK 8中新增了join方法。(实在惭愧,JDK 8都发布多久了。。。)源码String重载了join方法,两个方法的异同点在于,第一个方法使用的可变参数,第二个方法使用的可迭代参数,这样设计主要是为了方法适用性更广。比如参数可以传一个数组、集合等等。下面就拿一个方法的源码来解析 String 类 ...原创 2018-07-18 22:38:24 · 2244 阅读 · 0 评论 -
【JDK源码分析】通过源码深入分析AbstractQueuedSynchronizer
前言AbstractQueuedSynchronizer是并发包的核心基础类,它是构建阻塞锁和相关同步器(信号量、事件,等等)的框架,内部为FIFO队列,采用的是一种基于CLH锁队列修改的同步队列。引用他人对CLH的解释,CLH锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程仅仅在本地变量上自旋,它不断轮询前驱的状态,假设发现前驱释放了锁就结束自旋。源码1. 父类Abstra...原创 2018-07-22 22:31:57 · 186 阅读 · 0 评论 -
【JDK源码分析】并发包同步工具Semaphore
前言这次分析信号量Semaphore,为什么称之为信号量呢?是因为它可以控制同时访问某个资源的操作数量或是同时执行某个指定操作的数量。就好比它像一个租赁汽车的公司,租赁公司的汽车的数量是固定的,用完需要归还,用之前需要去租借(acquire 前提是还有可用的汽车),如果汽车都被租出去了,那只能等到别人归还了才能租到。它是基于AQS的共享锁来实现的,其中使用了较多的AQS的方法,所以在这之前最好...原创 2018-07-27 02:07:11 · 272 阅读 · 0 评论 -
【JDK源码分析】并发包同步工具CountDownLatch
前言CountDownLatch是一个闭锁实现,它可以使一个或者多个线程等待一组事件发生。它包含一个计算器,用来表示原创 2018-07-26 23:15:48 · 202 阅读 · 0 评论 -
【JDK源码分析】同步工具Exchanger,它的内部实现原理你看懂了吗?
前言Exchanger应该算并发包中工具使用相对少的,因为它主要用于线程之间交换数据,它的用法比较简单在不同线程之间使用exchange方法交换数据,但是内部实现比较巧妙,使用了unsafe的CAS原子操作、自旋来解决冲突问题,下面我们通过源码一探究竟。源码先看看源码注释中关于核心算法的介绍 for (;;) { if (slot is...原创 2018-07-29 21:53:36 · 318 阅读 · 0 评论 -
【JDK源码分析】深入理解ThreadLocal以及破坏它的线程隔离机制
前言众所周知ThreadLocal提供了线程局部变量,独立于变量的初始化副本。也就是ThreadLocal通过get或者set方法都是与当前线程相关联。深入源码set方法 public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = ge...原创 2018-07-20 02:09:33 · 201 阅读 · 0 评论 -
【JDK源码分析】并发包同步工具CyclicBarrier
前言CyclicBarrier它是什么?一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点。类似于朋友之间联系要在中午聚个会,几个朋友全部到齐后才开始喝酒吃菜。源码CyclicBarrier属性和构造器public class CyclicBarrier { // 互斥锁 private final ReentrantLock lock = ne...原创 2018-07-24 23:52:31 · 145 阅读 · 0 评论 -
【JDK源码分析】通过源码彻底理解ReentrantLock显示锁
前言ReentrantLock和synchronized一样是一个可重入的互斥锁,但ReentrantLock功能更强大,它提供了非公平和公平两种锁争用策略供使用者选择,而synchronized只有非公平一种。ReentrantLock提供了可中断的锁等待机制以及可用于多组线程需要分组唤醒的条件。类图下面是ReentrantLock的类图,内部抽象类Sync继承了Abstract...原创 2018-07-24 16:48:03 · 212 阅读 · 0 评论 -
【JDK源码分析】StringBuilder、StringBuilder、String、AbstractStringBuilder源码解析
前言JDK 8 String为不可变,StringBuilder、StringBuffer都为可变。 为什么String是不可变的?// final修饰,禁止继承Stringpublic final class String implements java.io.Serializable, Comparable<String>, CharSequence ...原创 2018-07-19 00:21:29 · 294 阅读 · 0 评论 -
【JDK源码分析】线程池ThreadPoolExecutor原理解析
前言一般情况下使用线程池都是通过Executors的工厂方法得到的,这些工厂方法又基本上是调用的ThreadPoolExecutor的构造器。也就是说常用到的线程池基本用到的是ThreadPoolExecutor。ThreadPoolExecutor的大概原理是先规定一个线程池的容量,然后给提交过来的任务创建执行线程,任务执行完毕后放在池子中等待新的任务提交过来,当然ThreadPoolExe...原创 2018-08-04 22:12:22 · 249 阅读 · 0 评论