Ch05-Java 之 引用类型
August 19, 2017
无论是通过引用计算算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关。
...无论是通过引用计算算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关。
...其中类加载的过程包括了加载
、验证
、准备
、解析
、初始化
五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持 Java 语言的运行时绑定 (也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。
在 HotSpot 虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头 (Header)、 实例数据 (Instance Data)、对齐填充 (Padding)。
...Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程一一对应的数据区域会随着线程开始和结束而创建和销毁。
JMM 定义了 Java 虚拟机 (JVM) 在计算机内存 (RAM) 中的工作方式,JVM 是 java 整个计算虚拟模型。
...JUC 即 java.util.concurrent
,是 Java 并发编程中很常用的实用工具类。它包含了 Lock 框架
,Collections 并发集合
,Executors 线程池
,Atomic 原子类
,Tools
。
java.lang.ThreadLocal
是一个将在多线程中为每一个线程创建单独的变量副本的类; 当使用 ThreadLocal 来维护变量时,ThreadLocal 会为每个线程创建单独的变量副本,避免因多线程操作共享变量而导致的数据不一致的情况。
1. 线程状态 # state 状态 说明 New 新建 新创建了一个线程对象,还未调用线程的 start() 方法 Runnable 就绪 线程对象创建后,其他线程调用了该对象的 start() 方法,该状态的线程位于可运行线程池中,变得可运行,等待获取 CPU 的使用权 Running 运行 就绪状态的线程获取了 CPU,执行程序代码的状态,还有种可能就是这个线程正在等待其他的系统资源(IO 资源等),这种状态也称为 Running 状态 Blocked 阻塞 一个线程因为等待监视锁而被阻塞的状态,也称之为阻塞状态。阻塞的线程不会被分配 CPU 资源 WAITING 等待 一个正在等待的线程的状态,也称之为等待状态 TIMED_WAITING 超时等待 一个在限定时间内等待的线程的状态。也称之为限时等待状态 Dead 死亡 线程执行完了或者因异常退出了 run() 方法,该线程结束生命周期 (当时如果线程被持久持有,可能不会被回收) 注意: WAITING: 造成线程等待的原因有三种,分别是调用 Object.wait()、join() 以及 LockSupport.park() 方法。处于等待状态的线程,正在等待其他线程去执行一个特定的操作。例如:因为 wait() 而等待的线程正在等待另一个线程去调用 notify() 或 notifyAll();一个因为 join() 而等待的线程正在等待另一个线程结束。处于等待状态的线程不会被分配 CPU 资源。 TIMED_WAITING: 造成线程限时等待状态的原因有五种,分别是调用 Thread.sleep(long)、Object.wait(long)、join(long)、LockSupport.parkNanos(obj,long) 和 LockSupport.parkUntil(obj,long)。 2. 线程状态转换 #
Happens-Before 规则 # 规则 说明 单一线程原则 在一个线程内,在程序前面的操作先行发生于后面的操作 管程锁定规则 一个 unlock 操作先行发生于后面对同一个锁的 lock 操作 volatile 变量规则 对一个 volatile 变量的写操作先行发生于后面对这个变量的读操作 线程启动规则 Thread 对象的 start() 方法调用先行发生于此线程的每一个动作 线程加入规则 Thread 对象的结束先行发生于 join() 方法返回 线程中断规则 对线程 interrupt() 方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过 interrupted() 方法检测到是否有中断发生 对象终结规则 一个对象的初始化完成 (构造函数执行结束) 先行发生于它的 finalize() 方法的开始 传递性 如果操作 A 先行发生于操作 B,操作 B 先行发生于操作 C,那么操作 A 先行发生于操作 C 参考文献 # Java 并发 - 理论基础
锁概念
...