javaSe
文章平均质量分 60
JDK源码分享
star++
致力于研究Apache开源项目
展开
-
多线程编程重新认识ReentrantLock
说明:文章转发自本人掘金文章 概述 ReentrantLock是我们常用的单机锁,可以帮助我们正确同步多线程代码。ReentrantLock是基于AQS实现的,我们可以看看ReentrantLock是怎么基于AQS实现锁机制的。 ReentrantLock原理 NonfairSync实现 1.lock方法(获取锁) a.线程A先获取锁,获取成功,直接运行同步代码(获取锁的线程在head节点) b.线程B,C获取锁发现锁状态已经改变,那么加入到队列中,并且线程被park 2.unlock方法(释放锁) a原创 2022-05-17 15:58:13 · 207 阅读 · 0 评论 -
多线程编程重新认识Volatile & synchronized
说明:转载本人掘金文章 https://juejin.cn/post/7082242009242550285 as-if-serial语义 as-if-serial语义初衷是为了提高指令执行速度(指令执行顺序优化),大概语义是保证在单线程情况下可以允许多个指令在没有数据依赖的情况下可以进行指令重排。 数据没有依赖 public static void test3(){ int a=0,b=0; a=1; //和b=1没有数据依赖 b=1; //和a=1没有数据依赖 } 这种情况原创 2022-05-17 15:54:00 · 132 阅读 · 0 评论 -
JAVA获取泛型真实类型的最终解决方案
概述 昨天碰到一个技术群同学问了这么一个问题,起初认为百度或者反射肯定能拿到的,后面怎么试都不行,确实是个问题。后来我换了一个思路,就解决了。那就是构建对象的时候把泛型真实类型也加进去,简而言之就是加个字段来记录真实类型。 代码 package com.example.others; public class Test { static class ResponseDto<T> { private T data; private Class dat原创 2021-12-10 10:15:16 · 794 阅读 · 0 评论 -
java并发理论摘要
数据依赖 所谓的数据依赖是指,如果多个java指令之间顺序变化会影响结果,那么说明这个这两个指令存在数据依赖关系。 as-if-serial 在一个线程中,会考虑数据依赖问题,也就是说如果两个指令有数据依赖的关系,那么不会重排序,因为会影响执行结果。但是在多线程中,是不考虑两个指令的数据依赖关系的,否则会严重影响多处理器的并行效率。as-if-serial是针对单线程来说的。 ...原创 2020-04-09 17:36:56 · 235 阅读 · 0 评论 -
(十二)JDK源码分析之常用并发工具类
CountDownLatch 功能 1.需要等待多个线程都完成某个任务,然后唤醒主线程继续执行; 2.当两个线程时,主线程需要等待子线程完成任务到某个进度,然后唤醒主线程继续执行。 使用 1.创建CountDownLatch对象,给一个初始值n,可以理解为进度数字n 2.执行CountDownLatch的await方法,主线程会被阻塞,直到CountDownLatch设置的n等于0 3...原创 2020-03-25 10:33:14 · 218 阅读 · 0 评论 -
(十一)JDK源码分析之AQS同步队列和等待队列交互图
建议 希望读者打开源码对照看,或者有AQS源码基础存在一些疑惑的同学看,一定能有所收获原创 2020-03-18 21:36:46 · 411 阅读 · 0 评论 -
(十)JDK源码分析之ReentrantLock流程总结
lock 1.调用AQS的acquire方法,先tryAcquire方法尝试获取锁根据status的判断。如果获取锁成功,那么直接返回结束;如果尝试获取失败,那么需要将当前线程封装为Node对象,加入到同步队列中。 2.如果尝试获取锁失败,那么在acquire继续调用addWaiter方法将当前线程封装为Node对象,加入到同步队列中,如果同步队列头结点没有初始化,那么先cas初始化头结点,然...原创 2020-03-18 00:16:54 · 154 阅读 · 0 评论 -
(九)JDK源码分析之使用线程安全的集合框架
概述 在我们开发当中多少会遇到线程安全的问题,虽然现在开发中遇到线程安全情况还是少的,因为在开发中我们很少会用共享变量,因为会尽量避免这种情况,特别是做简单的CURD。当然,现在架构都是微服务架构,jdk这种底层锁也只是对一台jvm有效,但是我们还是了解下,这样才能应对更复杂(分布式锁)的情况 ...原创 2020-01-06 16:01:57 · 261 阅读 · 0 评论 -
(八)JDK源码分析之集合框架ArrayList
概述 ArrayList是java集合框架中最常见的,也是用的最多的一种,底层采用的数据结构就是数组,使用和实现起来非常简单。 构造方法 说明:构造方法一共三个 1.直接指定一个初始大小,直接创建这个大小的数组分配给ArrayList持有,size=0 2.无参构造函数,直接创建一个空数组分配给ArrayList持有,size=0 3.使用符合有界泛型集合的持有数组分配给ArrayLis...原创 2020-01-02 19:50:37 · 187 阅读 · 0 评论 -
(七)JDK源码分析之两种线程等待通知模式实现
概述 在java中,有一个经典的问题,这个经典的问题就是生产者和消费者。这个的实现就是通过多线程的等待通知模式实现的,目前有两种实现方式,一个是基于jvm,一个是基于jdk. 实现 import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Condition; import ...原创 2019-12-27 11:15:13 · 208 阅读 · 0 评论 -
(六)JDK源码分析之可重入读写锁ReentrantReadWriteLock
概述 可重入读写锁,其实就是在重入锁基础上区分了一下读写锁.读写锁也称为共享锁,也就是说可以多个线程同时获取锁,这样大大提高了系统的吞吐量. 读写锁中 读锁和读锁是共享的,写锁和读锁写锁都是互斥的. 锁的状态如何区分读写锁 我们经过前面分析,知道在同步器中,用了一个int型来表示一个状态,当这个int值不为0时,说明这个时候锁是被获取了的,这个时候其他线程只能自旋等待, 当然到了读写锁也...原创 2019-12-14 00:02:14 · 217 阅读 · 0 评论 -
(五)JDK锁源码分析之可重入锁ReentrantLock
概述 什么叫可重入锁,简而言之就是同一个线程可以多次获取锁而不被阻塞 使用举例 public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new TestLock()).start(); } System.out.p...原创 2019-11-06 00:04:21 · 373 阅读 · 0 评论 -
(四)JDK线程池源码分析3之常见问题解答
概述 在线程池使用过程中难免会有一些疑问,比如一些参数怎么设置,线程池中线程怎么回收,核心线程和非核心线程的区别,线程在执行任务发生异常,执行任务发生异常任务会不会丢失,线程池任务队列满了怎么办等… 这篇文章将会从源码的角度给出答案 JDK线程池源码分析1-线程池执行启动流程 JDK线程池源码分析2-线程池中线程生命周期 线程执行任务发生异常,线程会回收吗? 执行的任务会丢失吗? 1...原创 2019-10-21 09:12:38 · 311 阅读 · 0 评论 -
(三)JDK线程池源码分析2之线程生命周期
概述 在JDK线程池源码分析1中我已经将线程池的创建,线程池中线程的创建,线程执行任务的整个流程已经分析完毕了,这次主要是来分析单个线程在线程池中是如何工作的以及如何被管理的.其实这个实现的流程主要在ThreadPoolExecutor的runWorker方法中进行实现的,对于runWorker是怎么触发的可以参考我的上一篇文章. runWorker方法主流程 主要由三部分组成: a.获...原创 2019-10-17 08:40:53 · 409 阅读 · 0 评论 -
(二)JDK线程池源码分析1线程池执行主流程
概述 在实际工作当中,线程池是我们经常要使用的,比如定时任务,或者需要异步执行,都是需要用到线程池的。在使用线程池的时候或许会发现一些奇怪的问题,或者说想根据现有线程池去改造一下,需要更好的满足业务需求,这个时候你就需要对线程池有足够的了解,如果你分析过源码,那么这些问题都能很好解决,利用线程池提出更好的使用方案和策略。 构造方法 一般情况下,我们直接倾向于使用Executors这个...原创 2019-10-16 15:42:42 · 320 阅读 · 0 评论