锁支持LockSupport
从上面我可以看到,当需要阻塞或者唤醒一个线程的时候,AQS都是使用LockSupport这个工具类来完成的 。
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语
每个使用LockSupport的线程都会与一个许可关联,如果该许可可用,并且可在进程中使用,则调用park()将会立即返回,否则可能阻塞 。如果许可尚不可用,则可以调用 unpark 使其可用 。但是注意许可不可重入,也就是说只能调用一次park()方法,否则会一直阻塞 。
LockSupport定义了一系列以park开头的方法来阻塞当前线程,unpark(Thread thread)方法来唤醒一个被阻塞的线程 。如下:
park(Object blocker)方法的blocker参数,主要是用来标识当前线程在等待的对象,该对象主要用于问题排查和系统监控 。
park方法和unpark(Thread thread)都是成对出现的,同时unpark必须要在park执行之后执行,当然并不是说没有不调用unpark线程就会一直阻塞,park有一个方法,它带了时间戳(parkNanos(long nanos):为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用) 。
底层支持
park()方法的源码如下:
public static void park() {
UNSAFE.park(false, 0L);
}
unpark(Thread thread)方法源码如下:
public static void unpark(Thread thread) {
if (thread != null)
UNSAFE.unpark(thread);
}
从上面可以看出,其内部的实现都是通过UNSAFE(sun.misc.Unsafe UNSAFE)来实现的,其定义如下:
public native void park(boolean var1, long var2);
public native void unpark(Object var1);
两个都是native本地方法 。Unsafe 是一个比较危险的类,主要是用于执行低级别、不安全的方法集合 。尽管这个类和所有的方法都是公开的(public),但是这个类的使用仍然受限,你无法在自己的java程序中直接使用该类,因为只有授信的代码才能获得该类的实例 。
参考资料
【线程阻塞的原因 线程阻塞】Doug Lea:《Java并发编程实战》方腾飞:《Java并发编程的艺术》
(今完)
推荐阅读
- 含猴的吉祥语
- 黄金彩虹兰花的养殖方法和注意事项,黄金彩虹兰花缺点?
- 红雪花养殖注意事项和修剪方法,红雪花的养殖方法?
- 地震是怎么形成的儿童讲解 地震是怎么形成的
- 树菠萝怎么看熟没熟 树上的树菠萝怎么看熟不熟
- 耐寒的多肉植物有哪些品种,多肉植物耐寒吗?
- 清苑县是哪个省的
- 人们吃的海带为什么要打结
- 萝卜施肥禁忌,萝卜如何施肥?
- 柚子的品种,柚子的种类?
