![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JDK
文章平均质量分 85
Alan CGH
从500强外企干到头部二手电商公司,目前流落到央企搞数字化
展开
-
网络编程,BIO到NIO,从Java代码角度理解
BIO Blocking IO在Java中 java.io 包下就是同步阻塞式IO,代表有InputStream OutputStream Reader Writer等,核心思想是面向流编程。NIO Non Blocking IOjava.nio 包下的新IO模型,为了解决传统IO带来的同步阻塞低效问题。但是今天不讲文件流的IO,今天面向的是网络IO,从这个角度理解下BIO到NIO的发展,以及操作系统底层epoll技术在Java的实现。...原创 2022-07-22 13:18:45 · 136 阅读 · 0 评论 -
AbstractQueuedSynchronizer 工作原理 JDK8
AbstractQueuedSynchronizer 是Java中有名的同步队列器,提供同步锁支持,包括共享同步锁,排它同步锁。还支持尝试获取锁机制(毫秒值),如果线程不能立即获取锁,还提供阻塞等待唤醒机制。ReentrantLock的Sync NonSync就是由AQS实现的。acquire(int arg) 是AQS对外提供的获取独占锁的重要方法,实际获取锁的逻辑交给用户的自定义同步器实现,获取锁失败后的阻塞队列逻辑则由AQS实现。.........原创 2022-07-22 12:58:52 · 243 阅读 · 0 评论 -
FutureTask原理 JDK8
FutureTask类是并发编程的一个代表异步计算任务类,提供异步计算任务的封装以及异步计算结果的返回。本身实现Runnable接口,可以直接提交给线程池执行。不过更多应该是配合Callable使用,因为要用到Callable.call()返回的结果封装在自己的outcome变量。那为什么有了Callable还要用这个类?因为它提供了获取异步计算结果的机制,如果任务没执行完会阻塞获取线程等待任务结束。省去了工程师自己管理的流程。本文基于JDK 8源码分析。FutureTask已经不依赖A.原创 2022-07-21 18:04:18 · 762 阅读 · 0 评论 -
ReentrantLock原理 JDK8
ReentrantLock (简称RS)是区别于 synchronized 的一种锁技术,特性有 等价于 synchronized 的 lock、可重入锁、公平锁与非公平锁、读锁与写锁、Condition对象等等......RS应该在同步性能上与synchronized 到底孰优孰劣,未知。不过由于 RS基于 volatile 变量 state 实现锁的机制,而 synchronized 是基于JVM的 mointer 对象实现的锁机制(偏向锁、轻锁不再考虑范围内)。各位可以自己推敲或试验下。...原创 2022-07-21 17:54:09 · 266 阅读 · 0 评论 -
volatile关键字的使用心得
在读一篇文章的时候,作者对volatile的使用场景就生动解释了它的使用误区:不要在依靠volatile变量现有值的情况下对其自身做修改其实就是不要拿volatile变量做多步骤的操作就是了。volatile变量单纯的读或写操作是可以的,例如:volatile int count = 1;单纯的写操作,直接将value赋值给count,不用读取count变量。这种操作相等于带锁的原子操作,因为其本身就是不可再分割的最小操作了。...原创 2022-07-21 17:21:20 · 133 阅读 · 0 评论 -
Thread类黑魔法原理
Thread类是Java中线程的抽象,是OS线程的一对一映射。Thread本身提供一些基础的并发控制API,利用它可以做基本的线程交互通信。将学习到 wait() notify() join() sleep() interrupt() 方法的原理Java中线程状态流转图可以看到Java的线程状态对比OS实际上是少了一个running的。JVM把running和ready状态合并成了runnable状态。可能由于Java属于上层应用通常不需要关注到线程当前的调度细分状态,设计者把运行中的状态原创 2022-07-21 17:14:17 · 103 阅读 · 0 评论 -
优雅关闭线程池
是在最后一个工作线程退出时会执行processWorkerExit,调用tryTerminate,先将状态推进到tyding,表示线程池正在清理中。shutdownNow方法将状态从running->stop,此时中断所有线程无论是否空闲还是工作中,抽出队列所有任务待返回给用户。shutdown方法将线程池状态从running->shutdown,这个状态下会拒绝所有提交的任务,直接调用拒绝策略。会开一个线程执行回调,并且等到钩子函数执行完毕JVM才会kill所有线程然后退出。会尝试中断所有空闲线程。...原创 2022-07-17 17:39:40 · 942 阅读 · 3 评论 -
线程池工作原理 ThreadPoolExecutor源码解析
会详细的分析源码,并通过注释应该要理解:1、线程池如何执行用户提交的任务。2、线程池创建线程的工作流程。3、线程池如何复用线程。4、线程池如何保证空闲线程生存指定的时间后被销毁。5、线程池销毁的工作流程。6、动态修改corePoolSize...原创 2022-07-17 17:37:35 · 163 阅读 · 0 评论 -
ConcurrentHashMap源码分析
文章深入分析了get函数,put函数和remove函数,以及并发扩容过程。ConcurrentHashMap的一半精华在于并发扩容,多个线程是如何协作加速迁移哈希槽中的元素。原创 2022-07-17 16:58:13 · 207 阅读 · 0 评论 -
ThreadLocal 源码 JDK8
ThreadLocal的学习一开始是比较绕的,慢慢的看源码思考,后来就能习惯了。对于学习这个类的使用,我们必须搞清楚三者之间的关系:ThreadLocalThreadLocalMapThreadThreadLocalMap是作为一个内部静态类嵌套在ThreadLocal中的,而当它具象化时(也就是new了)它作为对象存在后,又会被Thread持有引用(地址或指针)。...原创 2022-07-17 16:53:58 · 229 阅读 · 0 评论 -
位图,BitSet分析
n%8n&7n模8意思取8的余数,将n分为8个一组,剩下不够8个的作为余数。一个数如果有8的余数必定会出现在低3位中,即1~7,都可以中低3位表示出来,所以在低3位留1,高位全0,与运算后就会保留下8的余数。n/8等于n被分成了多少组,159/8=19(向下取整)排第159的数字被分到第19组。n%8得到的余数代表n这个数字在那一组的组内排号,如159%8=19......7代表159在第19组中的第7个位置。...原创 2022-07-17 16:49:39 · 96 阅读 · 0 评论 -
HashMap源码分析
HashMap源码分析解读,JDK8版本。深刻理解put、get函数,扩容的过程以及哈希表为什么一定要以2的幂次方扩容,这样做有什么好处?原创 2022-07-17 16:44:28 · 198 阅读 · 0 评论 -
JDK动态代理学习
探索原理之前需要明白JDK动态代理如何使用,首先需要自定义一个调用处理器对象h,这个h将会是连接代理对象和目标对象的中间桥梁,它决定了调用目标对象之前需要做一些什么事情,调用什么方法等等...使用的时候像这样子,虽然InvocationHandler接口没有强制要求定义构造函数接收目标对象,但一般为了桥接目标对象肯定得拿到它的引用,除非你用代理类来做其他事情,不需要目标对象。......原创 2022-07-17 16:08:07 · 190 阅读 · 0 评论 -
Cglib代理如何生成的及工作原理
Cglib是一个高效的动态代理方式,并且在SpringBoot中默认的代理实现方式。本片文章会分析Cglib是如何生成代理对象、代理对象如何执行相应的目标函数、及和jdk代理有什么区别。validatedClasses是静态容器,是对在系统中所有通过cglib创建的目标对象中是否有finalmethod的检查。因为Cglib代理在继承目标对象时要复写所有函数,不可以复写final修饰的函数。在构建代理对象时通过通知规则来配置。这个通知规则包含了通知器和通知方法。}......原创 2022-07-17 16:28:49 · 2249 阅读 · 0 评论