zoukankan      html  css  js  c++  java
  • LockSupport源码分析

    LockSupport提供park()和unpark()方法实现线程阻塞和唤醒。底层实现是通过sun.misc.Unsafe的park和unpark。

    关于sun.misc.Unsafe的说明请参见我的另外一篇博客。

    核心就是通过一个信号量(permit)实现的,0阻塞,1继续执行。

    park时可以指定blocker以及阻塞时长或者阻塞到什么时间点,通过UNSAFE.park第一个boolean参数决定,true指定时间,false指定时长。

    可以先执行unpark,再执行part的时候发现之前unpark设置为1了,直接继续执行,并设置信号量为0。

    park时除了unpark或者时间到了的情况外,阻塞的线程也会被其他线程调用该线程的interrupt方法中断并立即返回,

    该过程不会抛出异常,所以调用者需要检查线程状态,是怎样的方式被唤醒的。

    park的注释说明如下:

    This method does <em>not</em> report which of these caused the
     method to return. Callers should re-check the conditions which caused
     the thread to park in the first place.

    与wait的区别:

    wait需要获取对象锁,LockSupport不需要;

    wait挂起的是当前线程,属于随机性,唤醒notify,notifyAll也是随机的,LockSupport直接控制的是线程,指定线程park,指定线程unpark或interrupt

  • 相关阅读:
    java.io.Serializable浅析
    SSH和SSM的区别
    [转]github详细教程
    GITHUB的使用
    常用端口-小结
    DNS的解析原理
    windows快捷键-小结
    ip地址0.0.0.0是什么意思
    windows插件框架下载地址
    redis和mongodb
  • 原文地址:https://www.cnblogs.com/restart30/p/10827106.html
Copyright © 2011-2022 走看看