![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 81
Alan CGH
从500强外企干到互联网独角兽,目前流落到央企搞数字化
展开
-
AbstractQueuedSynchronizer 工作原理 JDK8
AbstractQueuedSynchronizer 是Java中有名的同步队列器,提供同步锁支持,包括共享同步锁,排它同步锁。还支持尝试获取锁机制(毫秒值),如果线程不能立即获取锁,还提供阻塞等待唤醒机制。ReentrantLock的Sync NonSync就是由AQS实现的。acquire(int arg) 是AQS对外提供的获取独占锁的重要方法,实际获取锁的逻辑交给用户的自定义同步器实现,获取锁失败后的阻塞队列逻辑则由AQS实现。.........原创 2022-07-22 12:58:52 · 223 阅读 · 0 评论 -
FutureTask原理 JDK8
FutureTask类是并发编程的一个代表异步计算任务类,提供异步计算任务的封装以及异步计算结果的返回。本身实现Runnable接口,可以直接提交给线程池执行。不过更多应该是配合Callable使用,因为要用到Callable.call()返回的结果封装在自己的outcome变量。那为什么有了Callable还要用这个类?因为它提供了获取异步计算结果的机制,如果任务没执行完会阻塞获取线程等待任务结束。省去了工程师自己管理的流程。本文基于JDK 8源码分析。FutureTask已经不依赖A.原创 2022-07-21 18:04:18 · 722 阅读 · 0 评论 -
ReentrantLock原理 JDK8
ReentrantLock (简称RS)是区别于 synchronized 的一种锁技术,特性有 等价于 synchronized 的 lock、可重入锁、公平锁与非公平锁、读锁与写锁、Condition对象等等......RS应该在同步性能上与synchronized 到底孰优孰劣,未知。不过由于 RS基于 volatile 变量 state 实现锁的机制,而 synchronized 是基于JVM的 mointer 对象实现的锁机制(偏向锁、轻锁不再考虑范围内)。各位可以自己推敲或试验下。...原创 2022-07-21 17:54:09 · 241 阅读 · 0 评论 -
volatile关键字的使用心得
在读一篇文章的时候,作者对volatile的使用场景就生动解释了它的使用误区:不要在依靠volatile变量现有值的情况下对其自身做修改其实就是不要拿volatile变量做多步骤的操作就是了。volatile变量单纯的读或写操作是可以的,例如:volatile int count = 1;单纯的写操作,直接将value赋值给count,不用读取count变量。这种操作相等于带锁的原子操作,因为其本身就是不可再分割的最小操作了。...原创 2022-07-21 17:21:20 · 131 阅读 · 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 · 96 阅读 · 0 评论 -
打印异常栈信息的过程和影响
在我们自己实际案例中也有,转转卖场双十一压测时,发现一个接口耗时偏高500ms+,经排查是打印大量日志(一次打印2个屏幕的量)。回到输出异常信息的地方,看到s.lock(),s是System.err的包装类,System.err是一个PrintStream对象。在别人的优化案例中也提到了大量日志输出会增加服务压力,首先大量日志打印造成大量线程争抢PrintStream流的独占锁,线程需要调用线程栈信息。所以回到一开始的场景,avenger框架屏蔽RPC异常超时的接口的异常栈信息打印而是换成自定义异常打印。.原创 2022-07-17 15:11:44 · 824 阅读 · 3 评论 -
String对象和常量池 intern可以干点什么
有一个使用场景,缓存没有数据时异步查询DB数据,为了避免大流量查询DB,需要在JVM中保证一个活动只放一个线程去查,这样并发查询的数量,对于一个活动来说,就是JVM实例的数量,一般也就十几台就是十几个并发。还有就是HashCode,HashCode是判断两个对象是否完全相等的核心条件,另外,像Set、Map结构中的key值也需要用到HashCode来保证唯一性和一致性,因此不可变的HashCode才是安全可靠的。这个锁对象要求所有的活动id使用同一个,刚好符合String常量池。.........原创 2022-07-17 15:30:07 · 159 阅读 · 0 评论