LinYaoTian's Blog

ArrayList源码分析

简介特点: 按照下标快速随机访问 允许存放多个null元素 存储的元素有序且可以重复 底层是Object数组 增加元素个数可能很慢(可能需要扩容),删除元素可能很慢(可能需要移动很多元素) 继承关系: 可以看到继承了AbstractList,此类提供 List 接口的骨干实现,以最大限度地减少实现”随机访问”数据存储(如数组)支持的该接口所需的工作;对于连续的访问数据(如链表),应优......

Java 并发(四) - 深入理解同步实现

构建自定义的同步工具内置的条件队列条件队列就如同烤面包机上的面包已好的铃声。如果你正在听着它, 当面包烤好后你可以立即注意到, 并且放下手头的事情开始品尝面包, 如果你没有听见它, 你会错过通知消息, 但是回到厨房后还是看到面包的状态, 如果已经烤完, 就取面包, 如果未烤完, 就再次监听铃声。 条件队列中的元素是一个个正在等待相关条件的线程;每一个对象都可以作为一个条件队列,并且 Obje......

Java 并发(三) - 活跃性和性能,死锁和显示锁

避免活跃性危险死锁定义:当一个线程永远占有一个锁,而其他线程尝试去获得这个锁,那么它们将永远被阻塞。 例如:当线程占有锁A时, 想要获得锁B, 但是同时, 另一个线程持有B, 并尝试获得A, 两个线程将永远等待下去, 这种情况是死锁的最简单的形式 。 一般来说,当死锁出现时,往往是在最糟糕的时候——高负载的情况下。 锁顺序死锁锁顺序死锁的原因是:两个线程以不同的顺序来获得相同的锁。 如果......

Java 并发(二) - Executor 框架

任务执行选择串行的方式执行任务,串行处理机制通常无法提高高吞吐率和快速响应性,于是我们可以显式地为任务创建线程,为每一个请求创建一个线程来执行任务,这样可以实现更高的响应性。 但是这样会带来很多问题: 线程的创建和销毁开销非常高 活跃的线程会消耗系统资源,尤其是内存。如果可运行的线程数量多于可用处理器的数量,那么有些线程就会闲置。大量空闲的线程会占用许多内存,给 GC 带来很大的压力......

Java 并发(一) - 基础知识

线程安全性要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问。 “共享”意味着变量可以由多个线程同时访问,而“可变”则意味着变量的值在其生命周期内可以发生变化。 如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个问题: 不在线程之间共享该状态变量 将状态变量修改......

JVM(九) - 线程优化与锁优化

线程安全当多个线程访问同一个对象时,如果不考虑这些线程在运行时环境下的调度和交替进行,也不需要进行额外的同步,或者在调用方进行任何的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。 Java 语言中的线程安全Java 中各种操作共享的数据分为以下 5 类: 不可变对象: 该对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要采取任何的线程安全保障......
JVM

JVM(八) - Java内存模型与线程

内存一致性协议由于 CPU 执行速度很快,而从内存读取数据和向内存写入数据的过程跟 CPU 执行指令的速度比起来慢得多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在 CPU 里面就有了高速缓存。 当程序在运行过程中,会将运算需要的数据从主存复制一份到 CPU 的高速缓存中,那么 CPU 进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当......
JVM

JVM(七) - JVM 晚期(运行期)优化

概述Java 程序在运行期间,可能会有某个方法或者代码运行特别频繁时,就会把这些代码认定为“热点代码”。为了提高热点代码的执行效率,在运行时 JVM 会将这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler,JIT 编译器)。 解释器和编译器事实上,现在许多主流的商用虚拟机,都同时包含有解释器与编译器,解释......
JVM

JVM(六) - JVM 早期(编译器)优化

概述JVM 的编译器可以分为三类编译器: 前端编译器:把 *.java 转变为 *.class 的过程。如 Sun 的 Javac 、Eclipse JDT 中的增量式编译器(ECJ)。 JIT 编译器:把字节码转变为机器码的过程,如 HotSpot VM 的 C1、C2 编译器。 AOT 编译器:静态提前编译器,直接将 *.java 文件编译本地机器代码的过程。 本节讲述的仅限于第一类......
JVM

JVM(五) - 虚拟机字节码执行机制

概述在 Java 中,编译器将源代码转成字节码,那么字节码如何被执行的呢?这就涉及到了 JVM 的字节码执行引擎,执行引擎负责具体的代码调用及执行过程。就目前而言,所有的执行引擎的基本一致: 输入:字节码文件 处理:字节码解析 输出:执行结果。 物理机的执行引擎是由硬件实现的,和物理机的执行过程不同的是虚拟机的执行引擎由于自己实现的。 运行时栈帧结构栈帧(Stack Frame)是用于支......
JVM