读LockSupport源码
来源:互联网 发布:linux调用内核模块 编辑:程序博客网 时间:2024/05/08 14:20
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 字段的值设置为 argprivate 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);}
1 0
- 读LockSupport源码
- LockSupport源码分析
- LockSupport源码探索
- LockSupport源码分析(JDK 1.7)
- LockSupport的源码分析(上)
- LockSupport的源码分析(中)
- JDK7中LockSupport源码解析
- LockSupport
- LockSupport
- LockSupport
- LockSupport
- LockSupport
- JUC源码分析5-locks-LockSupport
- LockSupport(park/unpark)源码分析
- Java多线程系列(五)—LockSupport源码分析
- java LockSupport
- java LockSupport
- Java LockSupport
- ubuntu的安装软件问题:E:Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavaila
- Web前端优化最佳实践
- linux之vim设置行号
- CMMI学习
- CAAnimation 类基本学习
- 读LockSupport源码
- JavaScript中对象的创建方式
- Linux学习笔记(06-06)Ubuntu用户密码正确但登陆无效解决方法
- SQL Server 批量插入数据的两种方法
- OC基础学习——如何解析plist文件和数据的归档和解档与json数据的解析
- 探索:移动互联网如何颠覆医疗
- 设计模式C++实现(16)——状态模式
- SAE上部署
- 如何快速开发网站?