Ch8-Java Lock 之 ReentrantReadWriteLock
January 21, 2020
java.util.concurrent.locks.ReentrantReadWriteLock
java.util.concurrent.locks.ReentrantReadWriteLock
java.util.concurrent.locks.ReentrantLock
java.util.concurrent.locks.LockSupport
AQS 即 java.util.concurrent.locks.AbstractQueuedSynchronizer
,可以用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器。
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 并发 - 理论基础