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

  • 相关阅读:
    盒子垂直方向外边距合并和盒子塌陷
    css选择器
    sublime常用快捷键
    浏览器内核
    JS基础知识归纳
    AngularJS实现单页面应用
    mysql备份思路
    mysql服务器参数--innodb引擎
    mysql如何查看索引使用情况以及优化
    mysql优化sql语句的思路浅谈
  • 原文地址:https://www.cnblogs.com/restart30/p/10827106.html
Copyright © 2011-2022 走看看