• volatile+DCL(双重检测)单例

    作者: 陆金龙       发表时间: 2022-12-30 22:28
    关键词:DCL  volatile  
    DCL(Double Check Lock)双重检测锁。减少了锁粒度,如果第一次检查instance不为null,那么就不需要执行下面的加锁和初始化操作。 利用volatile的禁止指令重排特性,弥补并发情形下双重检测单例模式的缺陷。 public class Singleton { // 使用volatile的禁止指令重排特性,避免获取到的实例因指令重排原因未完成初始化,使用时报错。 private volatile static Singleton instance; private Singleton(){ } ...
  • Java开发中的消息队列及选型

    作者: Kinglong       发表时间: 2022-12-25 21:51
    关键词:RabbitMQ  RocketMQ  Kafka  
    1.为什么要使用消息队列 使用消息队列,比较核心的目的有3个:解耦、异步、削峰。 解耦:以松耦合的方式实现系统之间的通信,保障各系统之间的独立性,更方便、灵活地实现系统的扩展和变更。 异步:将任务中的耗时步骤交给MQ及消息订阅模块处理,避免阻塞,提高响应速度。 削峰:将短暂的高峰期请求积压在MQ中,然后以数据库能够承受的速度从消息队列中逐渐拉取出来进行处理。将并发请求高峰时段的压力由数据库IO操作转移到MQ中,避免服务器因为超负荷请求而崩溃。 2.使用消息队列会面临哪些问题 (1)系统可用性降低:如果MQ挂掉,造成整套系统崩溃。 (2)系...
  • JVM系列实践:Java内存模型与线程

    作者: 陆金龙       发表时间: 2022-12-24 01:56
    关键词:volatile  synchronized  monitorneter  monitorexit  
    1.并发处理 并发处理的应用使得Amdahl定律取代摩尔定律成为计算机性能发展的源动力。 Amdahl定律:S=1/((1-a)+a/n)。a是并行计算部分占比,n是并行处理节点数。 (1)增加处理器数,计算负载分布到更多处理器上,提高计算速度。 (2)程序中可并行代码比例决定增加处理器带来速度提升的上限。 2.内存模型 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量的底层细节。这里的变量包括静态字段、实例字段和构成数组对象的元素,但不包括局部变量和方法参数,因为后者是存放在各线程对应的虚...
  • JVM系列实践:运行期优化

    作者: 陆金龙       发表时间: 2022-12-24 01:20
    关键词:解释执行  即时编译  基于计数器的热点探测  
    主要内容来自:周志明著,《深入理解Java虚拟机》 1.解释器与编译器 在部分的商用虚拟机如Sun HotSpot、IBM J9中,Java程序最初是通过解释器进行解释执行。 后续发展成解释器与即时编译器并存的架构。 虚拟机将运行特别频繁的方法或代码块认定为热点代码(Hot Spot Code)。即时编译器把热点代码编译成与本地平台相关的机器码,进行各种层次的优化。 解释器与编译器并存的优势: (1)程序需要迅速启动和执行时,解释器可以首先发挥作用,让程序立即执行,省去编译时间。 (2)随着程序运行时间的增加,编译器逐渐发挥作用,把越来越...
  • JVM系列实践:前端编译优化

    作者: 陆金龙       发表时间: 2022-12-23 23:15
    关键词:早期编译  前端编译  javac  ECJ  类型擦除  
    主要内容来自:周志明著,《深入理解Java虚拟机》 1.编译器 前端编译器:Sun的Javac、Eclipse JDT的增量式编译器(ECJ)。 JIT编译器:HotSpot VM 的C1、C2编译器。 AOT编译器:GCJ(GNU Compiler for the Java)、Excelsior JET。 2.Javac编译器 Javac编译器是由Java语言编写的程序。放在JDK_SRC_HOME/langtools/src/share/classes/com/sun/tools/javac中。 除了JDK自身的API,只引入了JDK...
  • JVM系列(四):PC寄存器(程序计数器)

    作者: 陆金龙       发表时间: 2022-12-02 04:19
    PC寄存器(程序计数器):存储下一条指令的地址。 CPU在不停的切换线程,切换到某个线程时,需要知道当前线程接着从哪继续执行。 每个线程都有它自己的程序计数器。 PC寄存器是一块很小的内存空间,是运行速度最快的存储区域。 PC寄存器是程序控制流指的示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。  
  • 类(接口)之间的六种关系及UML图表示

    作者: 陆金龙       发表时间: 2022-12-01 02:24
    关键词:UML图  泛化  实现  依赖  关联  聚合  组合  
    1.泛化(继承) 泛化:实线空心三角形箭头。 在Java中就是继承。 2.实现 实现:虚线空心三角形箭头。 实现接口。 3.依赖      依赖:虚线箭头。      是一种使用关系,即一个类的实现需要另一个类的协助。如方法参数需要传入另一个类的对象,就是依赖这个类。      比如打印机的工作依赖于电脑。      4.关联      关联...
  • JVM系列(三):运行时数据区概述

    作者: 陆金龙       发表时间: 2022-11-20 05:49
    JVM内存布局规定了Java程序运行过程中内存申请、分配、管理的策略,保证JVM的高效运行。 运行时数据区结构如下图: 方法区和堆是一个进程(一个运行中的虚拟机)只有一份,虚拟机栈、程序计数器和本地方法栈是每个线程一份。优化的重点是堆空间,少量的在方法区(方法区在jdk8换成元空间了,堆外内存) 运行时数据区内容的三大重点是:虚拟机栈、方法区、堆。堆和方法区是有垃圾回收的。