java
zyc920716
这个作者很懒,什么都没留下…
展开
-
Spring @Scheduled线程模型探究 - 改为多线程
通过上一节分析源码我们知道,执行任务的是TaskScheduler的实现类,在ScheduledAnnotationBeanPostProcessor#finishRegistration()方法中会设置TaskScheduler。首先如果注册器ScheduledTaskRegistrar中的scheduler成员为空才会从Spring上下文中加载我们只需要为ScheduledTaskReg...原创 2020-03-14 20:19:48 · 448 阅读 · 1 评论 -
JDK源码走读之ReentrantLock
ReentrantLock的功能几乎等同于Synchronized,在分析源码之前,我们首先来明确一下ReentrantLock要实现的功能,这样才能做到有的放矢。控制线程执行顺序。当线程获取锁进入Synchronized代码块(获取监视器),其余线程必须等待该线程执行完毕,才能继续执行该代码块。提供线程通信功能。Synchronized关键字支持在其代码块中使用await、notify、原创 2017-11-11 17:30:26 · 373 阅读 · 0 评论 -
控制三个线程交替打印ABC
package me.zyc.thread.test;import java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject;import java.util.concurrent.locks.ReentrantLock;public class LoopRunByOrder { private s原创 2018-01-10 17:38:59 · 444 阅读 · 0 评论 -
Java对象内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头 HotSpot虚拟机的对象头包括两部分信息:第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的转载 2017-11-13 21:30:50 · 217 阅读 · 0 评论 -
如何优雅的停止服务(ShutdownHook)
JDK提供了Runtime.addShutdownHook(Thread hook)方法用来注册一个钩子(线程),在Java程序退出时会调用这个钩子来清理现场。这个钩子会在以下场景中被调用: 1. 程序正常退出 2. 使用System.exit() 3. 终端使用Ctrl+C触发的中断 4. 系统关闭 5. OutOfMemory宕机 6. 使用Kill pid命令干掉进程(原创 2017-10-16 15:24:09 · 3308 阅读 · 0 评论 -
如何聪明地使用锁
竞争锁是造成多线程应用程序性能瓶颈的主要原因 区分竞争锁和非竞争锁对性能的影响非常重要。如果一个锁自始至终只被一个线程使用,那么 JVM 有能力优化它带来的绝大部分损耗。如果一个锁被多个线程使用过,但是在任意时刻,都只有一个线程尝试获取锁,那么它的开销要大一些。我们将以上两种锁称为非竞争锁。而对性能影响最严重的情况出现在多个线程同时尝试获取锁时。这种情况是 JVM 无法优化的,而且通常会发生从用户转载 2017-11-10 16:07:12 · 1720 阅读 · 0 评论 -
JDK源码走读之LinkedList
LinkedList本质是一个双端链表,双端链表区别于双向链表,双向链表之链表的首位相连,而双端链表则分别持有链表头尾两个节点,访问时既可以从头开始,也可以从尾部开始。链表结构 定义LinkedList实现了List、Dequet接口使它兼具二者的特性,既支持集合的添加删除操作,又支持队列的出队入队操作public class LinkedList<E> extends AbstractSeque原创 2017-10-24 17:00:10 · 201 阅读 · 0 评论 -
JDK源码走读之ArrayList
ArrayList其实就是动态数据,它封装了初始化、添加、删除、遍历等操作,并加入了泛型支持,下面我们从几个方面来分析一下ArrayList的实现。定义public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{原创 2017-10-23 17:18:58 · 213 阅读 · 0 评论 -
JDK源码走读之深入理解线程池(ThreadPoolExecutor)
Java线程池提供了一个框架来统一管理线程,通过把提交任务和执行任务解耦,使开发者无需关心线程的运行状态,只要把任务提交给线程池既可。使用线程池有以下好处: 1. 减少在创建和销毁线程上所花的时间以及系统资源的开销 2. 避免创建过多的线程导致系统资源过度消耗、系统执行效率低下线程池可以通过工厂类Executors创建,大致分为以下几种: 1. newFixedThreadPool(int原创 2017-10-28 18:28:58 · 314 阅读 · 0 评论