Java LockSupport 学习笔记

更多 Java 并发编程方面的文章,请参见文集《Java 并发编程》


所在包 java.util.concurrent.locks

LockSupprot 是线程的阻塞原语,用来阻塞线程和唤醒线程。每个使用 LockSupport 的线程都会与一个许可 permit 关联:

  • 如果该许可可用,并且可在线程中使用,则调用 park() 将会立即返回,否则可能阻塞。
  • 如果许可尚不可用,则可以调用 unpark 使其可用。

注意:

  • 许可不可重入,也就是说只能调用一次 park()方法,否则会一直阻塞。
  • 和信号量不同的是,这个许可不可以累加(即连续的 unpark() 和1次效果一样)。

阻塞线程

  • static void park():阻塞当前线程,如果调用 unpark 方法或者当前线程被中断,从能从 park() 方法中返回
  • static void park(Object blocker):功能如上,入参增加一个 Object 对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查
  • static void parkNanos(long nanos):阻塞当前线程,最长不超过 nanos 纳秒,增加了超时返回的特性
  • static void parkNanos(Object blocker, long nanos):功能如上,入参增加一个 Object 对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查
  • static void parkUntil(long deadline):阻塞当前线程,直到 deadline
  • static void parkUntil(Object blocker, long deadline):功能如上,入参增加一个Object 对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查

唤醒线程

  • static void unpark(Thread thread):唤醒处于阻塞状态的指定线程

实际上 LockSupport 阻塞和唤醒线程的功能是依赖于 sun.misc.Unsafe

示例

public static void main(String[] args) throws Exception {
    Thread t = new Thread() {
        public void run() {
            LockSupport.park();
            System.out.println(Thread.currentThread().getName() + " started");
        }
    };

    t.start();

    Thread.sleep(2000);

    LockSupport.unpark(t);
}

synchronzed VS LockSupprt

  • synchronzed 致使线程阻塞,线程会进入到 BLOCKED 状态,而调用 LockSupprt.park() 方法阻塞线程会致使线程进入到 WAITING 状态
  • synchronzed 阻塞的线程加入到同步队列,再次被唤醒的线程是随机从同步队列中选择的,而LockSupport.unpark(thread) 可以指定线程对象唤醒指定的线程

引用:
LockSupport工具

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • LockSupport,构建同步组件的基础工具,帮AQS完成相应线程的阻塞或者唤醒的工作。 LockSupport...
    miaoLoveCode阅读 15,470评论 3 23
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,065评论 1 18
  • 原创文章&经验总结&从校招到A厂一路阳光一路沧桑 详情请戳www.codercc.com 1. LockSuppo...
    你听___阅读 13,192评论 1 9
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,188评论 1 15
  • 人到中年,唯心独醉,扬手是春,落手是秋,在这一扬一落之间,心中有种淡淡的酸楚:是被青春抛弃的无奈,是被岁月洗尽...
    许利红阅读 3,199评论 1 0