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();

posted @ 2018-11-06 18:10  AJimmyFang  阅读(195)  评论(0编辑  收藏  举报