随笔分类 - JAVA
摘要:【转载】Java并发面试系列:彻底掌握 volatile 关键字原理 什么是 volatile volatile 是 Java 中的一种轻量级同步机制的关键字,当一个变量被 volatile 修饰后,有两层含义: 保证了该变量的修改对所有线程可见 禁止指令重排序优化 另外,volatile 不保证原
阅读全文
摘要:JAVA 双亲委派与类加载器 双亲委派 虚拟机在加载类的过程中需要使用类加载器进行加载,而在Java中,类加载器有很多,那么当JVM想要加载一个.class文件的时候,到底应该由哪个类加载器加载呢? 这就不得不提到”双亲委派机制”。 首先,我们需要知道的是,Java语言系统中支持以下4种类加载器:
阅读全文
摘要:JAVA线程池 submit方法返回值 AbstractExecutorService public abstract class AbstractExecutorService implements ExecutorService { // RunnableFuture 是用于获取执行结果的,我们
阅读全文
摘要:JAVA线程-interrupt 中断一个线程非常简单,只需要在其他线程中对目标线程调用interrupt()方法,目标线程需要反复检测自身状态是否是interrupted状态,如果是,就立刻结束运行。 案例一: public class Main { public static void main
阅读全文
摘要:JAVA并发-Thread.sleep(0)深入理解 Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。 通过调用 Thread.sleep(0) 的目的是为了让 GC 线程有机会被操作系统选中,从而进行垃圾清理的工作。它的副作用是,可能会更频繁地运行 GC,毕竟
阅读全文
摘要:JAVA并发-Disruptor框架 Disruptor简介 最好的方法去理解Disruptor就是将它和容易理解并且相似的队列,例如BlockingQueue。Disruptor其实就像一个队列一样,用于在不同的线程之间迁移数据,但是Disruptor也实现了一些其他队列没有的特性,如: 同一个“
阅读全文
摘要:JAVA Unsafe类详解 官方不建议使用Unsafe 使用Unsafe要注意以下几个问题: 1、Unsafe有可能在未来的Jdk版本移除或者不允许Java应用代码使用,这一点可能导致使用了Unsafe的应用无法运行在高版本的Jdk。 2、Unsafe的不少方法中必须提供原始地址(内存地址)和被替
阅读全文
摘要:CPU个数、核数、线程数、JAVA多线程关系 cpu个数、核数、线程数的关系 cpu个数:是指物理上,也及硬件上的核心数; 核数:是逻辑上的,简单理解为逻辑上模拟出的核心数; 线程数:是同一时刻设备能并行执行的程序个数,线程数=cpu个数 * 核数【如果有超线程,再乘以超线程数】 cpu线程数和Ja
阅读全文
摘要:案例: import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.LocalDateTimeUtil; import com.fasterxml.jackson.annotation.JsonInclude; import com
阅读全文
摘要:简介 ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行;当多个“小任务”执行完成之后,再将这些执行结果合并起来即可。 Java7 提供了ForkJoinPool来支持将一个任务拆分成多个“小任务”
阅读全文
摘要:基本概念 指针碰撞 一般情况下,JVM的对象都放在堆内存中(发生逃逸分析除外)。当类加载检查通过后,Java虚拟机开始为新生对象分配内存。如果Java堆中内存是绝对规整的,所有被使用过的的内存都被放到一边,空闲的内存放到另外一边,中间放着一个指针作为分界点的指示器,所分配内存仅仅是把那个指针向空闲空
阅读全文
摘要:JAVA 对象头分析及Synchronized锁 对象内存布局 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 从上面的这张图里面可以看出,对象在内存中的结构主要包含以下几个部分: Mark
阅读全文
摘要:泛型擦除概念 Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦
阅读全文
摘要:概述 JMH只适合细粒度的方法测试,并不适用于系统之间的链路测试 使用Maven搭建基准测试项目骨架 JMH官方推荐使用Maven来搭建基准测试的骨架,使用也很简单,使用如下命令来生成maven项目: mvn archetype:generate -DinteractiveMode=false -D
阅读全文
摘要:Stream中过滤null的情形 class Customer { private Long id; private String name; public Customer(Long id, String name) { this.id = id; this.name = name; } publ
阅读全文
摘要:简介 SPI的全名为Service Provider Interface,主要是应用于厂商自定义组件或插件中。在java.util.ServiceLoader的文档里有比较详细的介绍。简单的总结下java SPI机制的思想:我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块、xml解析
阅读全文
摘要:java文件编译成二进制字节码class文件 class文件再通过类加载器加载到JVM的永久代(jdk8以后就变成了Metaspace元数据,这里说一下,永久代跟元数据都是实现方法区的手段,方法区是一种规范) 应用启动时,通过方法区中类的元信息,静态变量,静态方法(想当于制造对象的说明书)创建对象。
阅读全文
摘要:ThreadLocal结构 下图是本文介绍到的一些对象之间的引用关系图,实线表示强引用,虚线表示弱引用: ThreadLocal的hashcode 在ThreadLocalMap中都需要根据索引i来get,set int i = key.threadLocalHashCode & (len-1);
阅读全文
摘要:案例 ,这里将会新增两个node 第一轮循环创建一个 ,空节点,线程也为空 第二轮将 加入到队列中,prev指向head 在最后一次release之前,tryAcquireShared会为 1 shouldParkAfterFailedAcquire parkAndCheckInterrupt(阻塞
阅读全文
摘要:源码: 内部类Sync CountDownLatch初始化 private void doAcquireSharedInterruptibly(int arg) throws InterruptedException { final Node node = addWaiter(Node.SHARED
阅读全文