读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);
}

欢迎关注订阅号:

目录
相关文章
|
NoSQL 关系型数据库 MySQL
阿里云RDS关系型数据库大全_MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等,NoSQL数据库如Redis、Tair、Lindorm和MongoDB
463 0
|
前端开发 搜索推荐 JavaScript
"揭秘!Python高手如何用Sphinx玩转个人博客?从零搭建,美到犯规,技术干货一网打尽,让你的博客秒变网红级存在!"
【8月更文挑战第14天】Sphinx是Python社区中用于编写和技术分享的强大工具,以其易用性和美观的文档输出著称。本文介绍如何用Sphinx打造个性化博客。首先需安装Python、Sphinx及sphinx_rtd_theme主题。接着通过`sphinx-quickstart`命令初始化项目并配置基本选项。在`conf.py`中可自定义博客元信息和主题设置。
258 3
|
SQL 关系型数据库 MySQL
怎么通过第三方库实现标准库`database/sql`的驱动注入?
在Go语言中,数据库驱动通过注入`database/sql`标准库实现,允许统一接口操作不同数据库。本文聚焦于`github.com/go-sql-driver/mysql`如何实现MySQL驱动。`database/sql`提供通用接口和驱动注册机制,全局变量管理驱动注册,`Register`函数负责添加驱动,而MySQL驱动在`init`函数中注册自身。通过这个机制,开发者能以一致的方式处理多种数据库。
139 3
|
前端开发
Canvas绘画之三条二次方贝塞尔曲线构成的复选框标记对号
Canvas绘画之三条二次方贝塞尔曲线构成的复选框标记对号
进制转换(二进制,八进制,十进制,十六进制)涵盖整数与小数部分,内容的图片全为手写【详细图解】
进制转换(二进制,八进制,十进制,十六进制)涵盖整数与小数部分,内容的图片全为手写【详细图解】
|
弹性计算 运维 持续交付
基于资源编排服务(ROS)实现存量资源的IaC化
如果您需要一种简单而有效的方法来管理大量云资源并实现自动化部署,推荐使用阿里云的资源编排服务ROS(Resource Orchestration Service)。ROS能够将存量资源转化为IaC(基础设施即代码),通过资源场景创建、模版生成和资源栈导入等功能,实现资源的统一管理和自动化部署。这不仅提高了资源管理的效率,还降低了成本。如果您想了解如何更轻松地管理云资源并加速部署流程,ROS是一个值得深入了解的工具。
|
Python
【python】二分查找
【python】二分查找
75 0
|
机器人 数据挖掘 区块链
高频量化对冲合约交易机器人app系统开发源代码详情
高频量化对冲合约交易机器人app系统开发源代码详情
|
安全 Linux
Linux驱动开发——并发和竞态(自旋锁方式的使用③)
Linux驱动开发——并发和竞态(自旋锁方式的使用③)
255 0
Linux驱动开发——并发和竞态(自旋锁方式的使用③)
|
JavaScript 前端开发 API
前端-vue基础86-axios的常见api
前端-vue基础86-axios的常见api
144 0
前端-vue基础86-axios的常见api