
Java11源码分析
Java11源码分析
集合/线程/数据结构
快乐崇拜234
学习笔记
展开
-
transmittable-thread-local:解决线程池之间ThreadLocal本地变量传递的问题
欢迎关注本人公众号概述当InheritableThreadLocal遇到线程池:主线程本地变量修改后,子线程无法读取到新值 一文中介绍了InheritableThreadLocal的问题:主线程变量修改后,子线程无法取到的问题。阿里开源的transmittable-thread-local解决了这个问题。transmittable-thread-local介绍git地址:transmittable-thread-local需求场景在ThreadLocal的需求场景即是TTL的潜在需求场景,如原创 2020-06-30 21:26:28 · 5200 阅读 · 0 评论 -
当InheritableThreadLocal遇到线程池:主线程本地变量修改后,子线程无法读取到新值
欢迎关注本人公众号之前已经介绍,InheritableThreadLocal可以在子线程创建的时候,将父线程的本地变量拷贝到子线程中。那么问题就来了,是只有在创建的时候才拷贝,只拷贝一次,然后就放到线程中的inheritableThreadLocals属性缓存起来。由于使用了线程池,该线程可能会存活很久甚至一直存活,那么inheritableThreadLocals属性将不会看到父线程的本地变量的变化public class InheritableThreadLocalTest1 { pub原创 2020-06-30 20:39:23 · 5690 阅读 · 1 评论 -
InheritableThreadLocal:子线程继承父线程的本地变量
欢迎关注本人公众号概述ThreadLocal可以保存一些变量仅供当前线程使用,其他线程不可见。实际工作中可能会由于任务复杂,父线程创建几个子线程并发致性任务,那么父线程的本地变量如何传递到子线程呢? 答案是使用InheritableThreadLocal。代码实例public static ThreadLocal<Integer> threadLocal = new InheritableThreadLocal<>(); public static void m原创 2020-06-30 20:15:48 · 3226 阅读 · 0 评论 -
ThreadLocal 内存泄漏 代码演示 实例演示
欢迎关注本人公众号阅读本文前请先阅读: ThreadLocal内存泄露原因分析不使用ThreadLocal下面这段程序创建了一个有5个线程的线程池。每个线程致性都申请5M大小的堆空间。public class MyThreadLocalOOM1 { public static final Integer SIZE = 500; static ThreadPoolExecutor executor = new ThreadPoolExecutor( 5, 5原创 2020-06-30 19:47:29 · 3303 阅读 · 14 评论 -
ThreadLocal内存泄露原因分析
欢迎关注本人公众号背景知识引用Object o = new Object();这个o,我们可以称之为对象引用,而new Object()我们可以称之为在内存中产生了一个对象实例。当写下 o=null时,只是表示o不再指向堆中object的对象实例,不代表这个对象实例不存在了。强引用一直活着:类似“Object obj=new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象实例。软引用有一次活的机会:软引用关联着的对象,在系统将要发生内存溢出异常之前,原创 2020-06-30 17:59:49 · 2819 阅读 · 3 评论 -
不要以为你用了BigDecimal后,计算结果就一定精确了
欢迎关注本人公众号异常再现大家应该都已经知道,涉及到金钱的计算应该使用BigDecimal,没有使用BigDecimal的已经被开除。但是使用了BigDecimal后计算结果就一定是精确的吗?未必。看下面测试BigDecimal a = new BigDecimal(1.01); BigDecimal b = new BigDecimal(2.02); BigDecimal c = new BigDecimal("1.01"); BigDecim原创 2020-05-26 17:52:21 · 1279 阅读 · 1 评论 -
jdk11源码--LongAdder源码分析原理分析
概述针对JDK中的原子类,想必大家都熟悉AtomicInteger,AtomicLong等类。他们都是采用CAS乐观锁方式来实现的。但是这种方式是否还有继续优化的空间呢?答案是肯定的。CAS乐观锁对临界区的数据(也就是atomicLong中的volatile long value属性)进行修改,这个属性是热点数据。并发量高的时候,会出现很多线程都轮询修改value属性的情况,CPU消耗比较高...原创 2020-01-10 16:07:34 · 597 阅读 · 0 评论 -
jdk11源码--SynchronousQueue源码分析
文章目录概述概述SynchronousQueue是一个同步阻塞队列,每一个 put操作都必须等待一个take操作。每一个take操作也必须等待一个put操作。SynchronousQueue是没有容量的,无法存储元素节点信息,不能通过peek方法获取元素,peek方法会直接返回null。由于没有元素,所以不能被迭代,它的iterator方法会返回一个空的迭代器Collections.empt...原创 2019-07-02 11:29:27 · 577 阅读 · 0 评论 -
Thread.Sleep 与 Thread.onSpinWait
文章目录Thread.SleepThread.onSpinWait总结Thread.Sleep一般情况下,我们让线程等待一段时间都是使用Thread.sleep()命令。比如下面这个demo示例:@Testpublic void test9() throws InterruptedException { new Thread(() -> { System.ou...原创 2019-07-02 20:36:07 · 3853 阅读 · 0 评论 -
LinkedBlockingQueue 和 ConcurrentLinkedQueue 的区别与联系
联系LinkedBlockingQueue 与 ConcurrentLinkedQueue 都是先进先出 FIFO的线程同步的队列。阻塞队列典型例子是 LinkedBlockingQueue适用阻塞队列的好处:多线程操作共同的队列时不需要额外的同步,另外就是队列会自动平衡负载,即那边(生产与消费两边)处理快了就会被阻塞掉,从而减少两边的处理速度差距。非阻塞队列典型例子是 Concurr...原创 2019-10-30 16:52:55 · 469 阅读 · 0 评论 -
为什么ArrayBlockingQueue单锁实现,LinkedBlockingQueue双锁实现
首先看一下本人两篇源码解析:jdk11源码–LinkedBlockingQueue源码分析jdk11源码–ArrayBlockingQueue源码分析细心的同学会发现,ArrayBlockingQueue的实现是“单锁+两个condition”,而LinkedBlockingQueue是采用的“双锁+各自的condition”来实现的。两个类的作者都是Doug Lea,这是为什么呢?...转载 2019-10-30 17:14:07 · 4154 阅读 · 1 评论 -
jdk11源码--LinkedBlockingQueue源码分析
文章目录概述构造方法链表节点数据结构关键属性puttake概述上一篇介绍了jdk11源码–ArrayBlockingQueue源码分析,接下来看一下LinkedBlockingQueue的实现。这两个阻塞队列最大的区别就是底层元素存储实现不同,ArrayBlockingQueue是基于数组,而LinkedBlockingQueue是基于单向链表。LinkedBlockingQueue类图如...原创 2019-07-01 21:45:16 · 492 阅读 · 0 评论 -
jdk11源码--ArrayBlockingQueue源码分析
更多java源码分析请见:jdk11源码分析系列文章专栏:Java11源码分析文章目录概述BlockingQueueArrayBlockingQueueputtake概述上一篇文章jdk11源码–ReentrantLock之Condition源码分析中分析了ReentrantLock和Condition的源码,那么接下来看一下Condition在JDK中的具体应用。ArrayBlock...原创 2019-07-01 14:41:21 · 545 阅读 · 0 评论 -
jdk11源码--ReentrantLock之Condition源码分析
文章目录概述创建Conditionawit概述在jdk11源码-ReentrantLock源码一文中分析了ReentrantLock源码。里面有讲述在多个线程加入队列时的AQS内部状态:创建Condition一个ReentrantLock可以创建多个ConditionCondition condition = lock.newCondition();实际是创建一个ConditionO...原创 2019-06-27 12:00:09 · 967 阅读 · 0 评论 -
jdk11源码--CountDownLatch源码分析
文章目录概述CountDownLatch初始化awaitcountDown概述CountDownLatch也是利用的AQS队列,关于AQS队列的讲述请参考前面两篇文章:jdk11源码-ReentrantLock源码jdk11源码–ReentrantReadWriteLock源码AQS类是一个模板类,我们可以根据根据具体的需求通过重写以下几个方法来自定义实现同步器tryAcquir...原创 2019-06-26 20:29:31 · 559 阅读 · 0 评论 -
jdk11源码--ReentrantReadWriteLock源码
文章目录概述读写标记的存储写锁的加解锁过程分析writeLock.lockwriteLock.unlock概述在上一篇博文jdk11源码-ReentrantLock源码中介绍了ReentrantLock的源码实现。ReentrantReadWriteLock是ReentrantLock的兄弟类,顾名思义,读写锁。当前其内部实现也是借助于AQS队列,不过与ReentrantLock的实现稍有不同...原创 2019-06-25 15:23:44 · 540 阅读 · 0 评论 -
jdk11源码-ReentrantLock源码
概述ReentrantLock是java中常用的加锁工具,下面是一个典型的写法:ReentrantLock lock = null;try { System.out.println(System.currentTimeMillis()); lock = new ReentrantLock(); lock.lock(); lock.lock(); Ti...原创 2019-06-24 18:01:56 · 1317 阅读 · 0 评论 -
jdk11源码--CopyOnWriteArrayList源码分析
文章目录概述基本属性创建`CopyOnWriteArrayList`add(E e)add(int index, E element)System.arraycopy关于@HotSpotIntrinsicCandidateget(int index)iterator 迭代器概述我们都知道CopyOnWriteArrayList是线程安全的列表,其内部是数组结构,并且适用于读多写少的应用场景。...原创 2019-03-02 14:12:18 · 798 阅读 · 0 评论 -
jdk11源码--Integer.numberOfLeadingZeros
该函数的功能是:在指定 int 值的二进制补码表示形式中最高位(最左边)的 1 位之前,返回零位的数量。如果指定值在其二进制补码表示形式中不存在 1 位,换句话说,如果它等于零,则返回 32。实现原理:源码:应用了典型的二分查找,先把32位整形分为高16位和低16位查找非零数,在对高16位进行或低16位进行二分// 首先在jvm中一个int类型的数据占4个字节,共32位,其实就相当于一个长度...原创 2019-02-26 20:03:51 · 1101 阅读 · 2 评论 -
JDK11源码--HashMap源码分析
文章目录概述hashmap数据结构基本参数`MAXIMUM_CAPACITY`为什么设置成1 &amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; 30为什么map的容量要限制为2的整数次方`DEFAULT_LOAD_FACTOR`负载因子为什么是0.75概述本文介绍JDK11中HashMap的源码实现。hashmap数据结构map中存储的是key,value键原创 2019-02-26 16:11:08 · 1734 阅读 · 4 评论 -
java高并发:CAS无锁原理及广泛应用
前言在现在的互联网技术领域,用户流量越来越大,系统中并发量越来越大,大公司的日活动辄成百上千万。如何面对如此高的并发是当今互联网技术圈一直在努力的事情。 应对高并发需要在各个技术层面进行合理的设计和技术选型才可以。本文只讲述微观层面是如何应对多线程高并发的,介绍著名的CAS原理以及其广泛应用。 本文中jdk版本使用的是jdk1.7.0_55. 不同版本实现可能稍有差异.CAS无锁实现原理为什原创 2016-12-20 12:53:39 · 30753 阅读 · 3 评论