博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LockSupport源码阅读
阅读量:6157 次
发布时间:2019-06-21

本文共 3855 字,大约阅读时间需要 12 分钟。

LockSupport源码阅读


/** 创建锁和同步类中使用的基础的线程阻塞原语*  * 除非你是多线程专家,而且你要自己设计和实现阻塞式线程同步机制(比如lock、condition等等),否则你不需要用park和unpark。这两个原语是用来实现这些的,不是给应用程序用的*/public class LockSupport {    //私有构造方法,不能被实例化    private LockSupport() {}     //把 Thread 实例 t 的 parkBlocker 字段的值设置为 arg    private static void setBlocker(Thread t, Object arg) {       UNSAFE.putObject(t, parkBlockerOffset, arg);    }    /**     * 如果给定线程的许可不可用,使其可用。     * 如果线程在 park上受阻塞,则它将解除其阻塞状态。否则,保证下一次调     * 用 park 不会受阻塞。     * 如果给定线程尚未启动,则无法保证此操作有任何效果。      */    public static void unpark(Thread thread) {        if (thread != null)            UNSAFE.unpark(thread);    }    public static void park(Object blocker) {        Thread t = Thread.currentThread();        setBlocker(t, blocker);        UNSAFE.park(false, 0L);        setBlocker(t, null);    }    /**     * 带超时时间的park     */    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);        }    }    /**     * 在deadline时间内,park     */    public static void parkUntil(Object blocker, long deadline) {        Thread t = Thread.currentThread();        setBlocker(t, blocker);        UNSAFE.park(true, deadline);        setBlocker(t, null);    }    /**     * 返回提供给最近一次尚未解除阻塞的 park 方法调用的 blocker 对象,如果该调用不受阻塞,则返回 null。     * 返回的值只是一个瞬间快照,即由于未解除阻塞或者在不同的 blocker 对象上受阻而具有的线程。     */    public static Object getBlocker(Thread t) {        if (t == null)            throw new NullPointerException();        return UNSAFE.getObjectVolatile(t, parkBlockerOffset);    }    /**     * 为了线程调度,禁用当前线程,除非有许可     * 如果许可可用,使用改许可,且调用立即返回。否则,为进程调度禁用当前      * 线程,直到发生以下三件事之前一直休眠     *     * 1、其它线程触发当前线程的unpark     * 2、其它线程中断当前线程     * 3、毫无逻辑的返回     * 此方法不返回谁引起此方法返回,调用方应该重新检查谁最先park此线程,      * 调用方也可以决定此线程返回时的中断状态      */    public static void park() {        UNSAFE.park(false, 0L);    }    /**     * 带超时时间的park     */    public static void parkNanos(long nanos) {        if (nanos > 0)            UNSAFE.park(false, nanos);    }    /**     * 在deadline时间内,park     */    public static void parkUntil(long deadline) {        UNSAFE.park(true, deadline);    }    /**     * Returns the pseudo-randomly initialized or updated secondary seed.     * Copied from ThreadLocalRandom due to package access restrictions.     */    static final int nextSecondarySeed() {        int r;        Thread t = Thread.currentThread();        if ((r = UNSAFE.getInt(t, SECONDARY)) != 0) {            r ^= r << 13;   // xorshift            r ^= r >>> 17;            r ^= r << 5;        }        else if ((r = java.util.concurrent.ThreadLocalRandom.current().nextInt()) == 0)            r = 1; // avoid zero        UNSAFE.putInt(t, SECONDARY, r);        return r;    }    //引用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); } }

参考:

使用方法:

转载地址:http://wpsfa.baihongyu.com/

你可能感兴趣的文章
linux:yum和apt-get的区别
查看>>
Sentinel 1.5.0 正式发布,引入 Reactive 支持
查看>>
数据库之MySQL
查看>>
2019/1/15 批量删除数据库相关数据
查看>>
数据类型的一些方法
查看>>
Webpack 2 中一些常见的优化措施
查看>>
移动端响应式
查看>>
js中var、let、const的区别
查看>>
简洁优雅地实现夜间模式
查看>>
react学习总结
查看>>
在soapui上踩过的坑
查看>>
MySQL的字符集和字符编码笔记
查看>>
ntpd同步时间
查看>>
Maven编译时跳过Test
查看>>
Spring Boot 整合Spring Security 和Swagger2 遇到的问题小结
查看>>
Apache通过mod_php5支持PHP
查看>>
java学习:jdbc连接示例
查看>>
Silverlight 如何手动打包xap
查看>>
禁用ViewState
查看>>
Android图片压缩(质量压缩和尺寸压缩)
查看>>