读LockSupport源码

简介: LockSupport类简介LockSupport类是其他类实现锁和同步的基础 * Basic thread blocking primitives for creating locks and other * synchronization classes.

LockSupport类简介

LockSupport类是其他类实现锁和同步的基础

 * Basic thread blocking primitives for creating locks and other
 * synchronization classes.

读了源码就会知道,这个类主要利用了Unsafe类中提供的part和unpart两个方法.而LockSupport类暴露出来的两个核心接口也是part和unpart两个.

如果需要阅读Unsafe类源码,参考我的另一篇博文:读Unsafe类源码

读源码

//构造方法私有化
private LockSupport() {} // Cannot be instantiated.

// 引用Unsafe类
private static final sun.misc.Unsafe UNSAFE;

//Thread类中 parkBlocker  字段的偏移量
private static final long parkBlockerOffset;

//Thread 类中 threadLocalRandomSeed 字段的偏移量
private static final long SEED;

//Thread 类中 threadLocalRandomProbe 字段的偏移量
private static final long PROBE;

//Thread 类中 threadLocalRandomSecondarySeed 字段的偏移量
private static final long SECONDARY;

//初始化上面4个字段的值
static {
    try {
        UNSAFE = sun.misc.Unsafe.getUnsafe();
        Class<?> tk = Thread.class;
        parkBlockerOffset = UNSAFE.objectFieldOffset
                (tk.getDeclaredField("parkBlocker"));
        SEED = UNSAFE.objectFieldOffset
                (tk.getDeclaredField("threadLocalRandomSeed"));
        PROBE = UNSAFE.objectFieldOffset
                (tk.getDeclaredField("threadLocalRandomProbe"));
        SECONDARY = UNSAFE.objectFieldOffset
                (tk.getDeclaredField("threadLocalRandomSecondarySeed"));
    } catch (Exception ex) { throw new Error(ex); }
}

//把 Thread 实例 t 的 parkBlocker 字段的值设置为 arg
private static void setBlocker(Thread t, Object arg) {
    // Even though volatile, hotspot doesn't need a write barrier here.
    UNSAFE.putObject(t, parkBlockerOffset, arg);
}

//获取对象 t 中 parkBlocker 字段的值
public static Object getBlocker(Thread t) {
    if (t == null)
        throw new NullPointerException();
    return UNSAFE.getObjectVolatile(t, parkBlockerOffset);
}

// 取消阻塞线程,如果线程已经处于非阻塞状态,那么下次调用park时不会阻塞线程
public static void unpark(Thread thread) {
    if (thread != null)
        UNSAFE.unpark(thread);
}

// 使当前调用线程在给定对象上阻塞(不能保证一定阻塞,
// 因为如果之前在非阻塞状态调用了unpar方法的话,此次调用park方法就不会阻塞线程)
public static void park(Object blocker) {
    Thread t = Thread.currentThread();
    setBlocker(t, blocker);
    UNSAFE.park(false, 0L);
    setBlocker(t, null);
}

// 阻塞线程
public static void park() {
        UNSAFE.park(false, 0L);
}

// 使当前线程在blocker对象上阻塞给定的纳秒时间
public static void parkNanos(Object blocker, long nanos) {
    if (nanos > 0) {
        Thread t = Thread.currentThread();
        setBlocker(t, blocker);
        UNSAFE.park(false, nanos);
        setBlocker(t, null);
    }
}

// 使当前线程在blocker对象上阻塞到给定的时间点
// 这个时间点是从Epoch time(1970-01-01 00:00:00 UTC)开始算起的某个具体的时间点。
public static void parkUntil(Object blocker, long deadline) {
    Thread t = Thread.currentThread();
    setBlocker(t, blocker);
    UNSAFE.park(true, deadline);
    setBlocker(t, null);
}

欢迎关注订阅号:

目录
相关文章
|
安全 Java
JUC第十一讲:JUC锁LockSupport详解
JUC第十一讲:JUC锁LockSupport详解
145 0
|
Java API
【JUC基础】09. LockSupport
LockSupport是一个线程阻塞工具,可以在线程任意位置让线程阻塞。线程操作阻塞的方式其实还有Thread.suspend()和Object.wait()。而LockSupport与suspend()相比,弥补了由于resume()方法而导致线程被挂起(类似死锁)的问题,也弥补了wait()需要先获得某个对象锁的问题,也不会抛出InterruptedException异常。
|
安全 Java C++
JUC在深入面试题——三种方式实现线程等待和唤醒(wait/notify,await/signal,LockSupport的park/unpark)
JUC在深入面试题——三种方式实现线程等待和唤醒(wait/notify,await/signal,LockSupport的park/unpark)
234 1
JUC在深入面试题——三种方式实现线程等待和唤醒(wait/notify,await/signal,LockSupport的park/unpark)
|
Java 程序员 API
JUC - 线程中断与线程等待、唤醒(LockSupport)
JUC - 线程中断与线程等待、唤醒(LockSupport)
JUC - 线程中断与线程等待、唤醒(LockSupport)
Jvm源码剖析之synchronized锁机制执行原理
Jvm源码剖析之synchronized锁机制执行原理
Jvm源码剖析之synchronized锁机制执行原理
|
关系型数据库 MySQL Java
【Semaphore、ReentrantLock、CountDownLatch、Cyclicbarrier、ReadWriteLock】多线程交替执行、顺序执行、同时执行、读写分离执行、生产者消费者
【Semaphore、ReentrantLock、CountDownLatch、Cyclicbarrier、ReadWriteLock】多线程交替执行、顺序执行、同时执行、读写分离执行、生产者消费者
126 0
【Semaphore、ReentrantLock、CountDownLatch、Cyclicbarrier、ReadWriteLock】多线程交替执行、顺序执行、同时执行、读写分离执行、生产者消费者
|
Java 调度
锁原理分析系列——LockSupport工具类
锁原理分析系列——LockSupport工具类
108 0
|
安全
【JUC】JDK1.8源码分析之LockSupport(一)
  最开始打算分析ReentrantLock,但是分析到最后,发现离不开LockSuport的支持,所以,索性就先开始分析LockSupport,因为它是锁中的基础,是一个提供锁机制的工具类,所以先对其进行分析。
129 0
【JUC】JDK1.8源码分析之LockSupport(一)