失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > LockSupport的park和unpark

LockSupport的park和unpark

时间:2022-07-17 21:56:20

相关推荐

LockSupport的park和unpark

LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语。

Java锁和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通过调用LockSupport.park()和LockSupport.unpark()实现线程的阻塞和唤醒的。LockSupport很类似于二元信号量(只有1个许可证可供使用),如果这个许可还没有被占用,当前线程获取许可并继续执行;如果许可已经被占用,当前线程阻塞,等待获取许可。

LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。因为park() 和 unpark()有许可的存在;调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。

LockSupport函数列表

// 返回提供给最近一次尚未解除阻塞的 park 方法调用的 blocker 对象,如果该调用不受阻塞,则返回 null。

static Object getBlocker(Thread t)

// 为了线程调度,禁用当前线程,除非许可可用。

static void park()

// 为了线程调度,在许可可用之前禁用当前线程。

static void park(Object blocker)

// 为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用。

static void parkNanos(long nanos)

// 为了线程调度,在许可可用前禁用当前线程,并最多等待指定的等待时间。

static void parkNanos(Object blocker, long nanos)

// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。

static void parkUntil(long deadline)

// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。

static void parkUntil(Object blocker, long deadline)

// 如果给定线程的许可尚不可用,则使其可用。

static void unpark(Thread thread)

说明:LockSupport是通过调用Unsafe函数中的接口实现阻塞和解除阻塞的。

park和wait的区别

在调用对象的Wait之前当前线程必须先获得该对象的监视器(Synchronized),被唤醒之后需要重新获取到监视器才能继续执行。

而LockSupport并不需要获取对象的监视器。LockSupport机制是每次unpark给线程1个"许可"——最多只能是1,而park则相反,如果当前线程有许可,那么park方法会消耗1个并返回,否则会阻塞线程直到线程重新获得许可,在线程启动之前调用 park/unpark方法没有任何效果。

因为它们本身的实现机制不一样,所以它们之间没有交集,也就是说LockSupport阻塞的线程,notify/notifyAll没法唤醒.

总结下 LockSupport的park/unpark和Object的wait/notify:

面向的对象不同;跟Object的wait/notify不同LockSupport的park/unpark不需要获取对象的监视器;实现的机制不同,因此两者没有交集。

虽然两者用法不同,但是有一点,LockSupport的park和Object的wait一样也能响应中断.

如果觉得《LockSupport的park和unpark》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。