Lock也要叫爸爸-LockSupport
Posted jimmyfanhome
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lock也要叫爸爸-LockSupport相关的知识,希望对你有一定的参考价值。
一.简介
1.定义以及作用:
用于创建锁和其他同步类的阻塞原语,也就是Lock 的爸爸?
2.许可(permit):
LockSupport通过许可(permit)实现挂起线程、唤醒挂起线程功能,有了permit就不会挂起(免死金牌)。
3.pack与uppack
pack(阻塞线程):挂起线程,当有permit时,不会挂起,没有时挂起
unpack(设置线程可用):没有permit时,由于要唤醒,不能没有permit,所以好,释放一个permit来唤醒。有permit时啥都不做啦。
二.具体使用之线程池
1.线程池的submit方法。
当向线程池扔了一个Callable任务时,它会把任务封装成一个FutureTask的任务返回,然后把任务交给线程池处理,下图中的newTaskFor就是返回一个FutureTask。
2.future.get()方法
当主线程调用get方法时,明显,是使用刚刚返回的FutureTask来调用get方法,它会判断一下任务是否已经完成,如果完成了返回结果,否则进入awaitDone方法阻塞等待,这个方法里面其实也是调用了LockSupport的park方法进行挂起阻塞。
3.FutureTask的run方法
其实任务的执行就是FutureTask的run方法执行,run方法底层使用了LockSupport的unpark来唤醒线程。
三.原理
1.park:调用本地方法UNSAFE.park();
2.unpark:调用本地方法UNSAFE.unpark();
以上是关于Lock也要叫爸爸-LockSupport的主要内容,如果未能解决你的问题,请参考以下文章