zoukankan      html  css  js  c++  java
  • LockSupport

    1.介绍

    java.util.concurrent.locks.LockSupport

    Basic thread blocking primitives for creating locks and other synchronization classes.

    和wait/notify相似,LockSupport主要作用是唤醒和阻塞线程,jdk源码中很常用(java.util.concurrent.locks包)。

    park():阻塞线程,原理是将_counter值置为0,判断前值是否为1(先unpark),若是直接放行,否则阻塞。

    unpark(Thread):唤醒线程,原理是将_counter值置为1,判断前值是否为0(park过),若是则唤醒线程,否则直接退出

    更多的api自行查阅jdk源码

    2.LockSupport与wait/notify区别

    (1)wait/notify是object方法,只能先获得锁对象再调用,也就是说只能在同步代码块中使用,而LockSupport没有这个限制。

    (2)当阻塞等待队列中有多个线程时,notify只能随机唤醒一个,unpark(Thread)可以唤醒指定线程。

    (3)LockSupport可以先unpark再park,线程也能顺利执行。但是unpark不可累计,也就是前面说的_counter值最多为1。

    3.LockSupport与interrupt()

    interrupt()会设置线程的中断标志位

    LockSupport.park()会检查线程是否设置了中断标志位,如果设置了,则返回(这里并不会清除中断标志位)

    也就是说interrupt()会唤醒park()的线程,但是不会抛异常,也不会清除中断标志位

    示例:

     1 public class LockSupportDemo {
     2 
     3     static MyThread t1 = new MyThread("t1");
     4     static MyThread t2 = new MyThread("t2");
     5 
     6     public static class MyThread extends Thread {
     7         public MyThread(String name) {
     8             super(name);
     9         }
    10 
    11         @Override
    12         public void run() {
    13             System.out.println("start " + getName());
    14             LockSupport.park();
    15             if (Thread.currentThread().isInterrupted()) {
    16                 System.out.println(getName() + "被中断了");
    17             }
    18             System.out.println(getName() + "继续执行");
    19         }
    20     }
    21 
    22     public static void main(String[] args) throws InterruptedException {
    23         t1.start();
    24         Thread.sleep(1000L);
    25         t2.start();
    26         Thread.sleep(3000L);
    27         t1.interrupt();
    28         LockSupport.unpark(t2);
    29     }
    30 }

    输出:

    start t1
    start t2
    t1被中断了
    t1继续执行
    t2继续执行

  • 相关阅读:
    笔记:Linux进程间通信机制
    Linux下C/C++和lua交互-Table
    @JsonFormat时间格式化注解使用
    关于 mybatis 报invalid comparison: java.util.Arrays$ArrayList and java.lang.String异常
    @RestControllerAdvice作用及原理
    MySQL 中 datetime 和 timestamp 的区别与选择
    idea提交svn忽略.class等文件的相关配置(so easy)
    PLSQL Developer建表时注释(COMMENT)中文乱码的解决方案(Windows)
    oracle客户端安装与配置
    PLSQL安装、PLSQL汉化、激活
  • 原文地址:https://www.cnblogs.com/ouym/p/14523990.html
Copyright © 2011-2022 走看看