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继续执行

  • 相关阅读:
    Docker学习-安装,配置,运行
    Docker学习-从无知到有知的学习过程
    学习记录-java基础部分(一)
    对get post等http请求方式的理解
    Mac和window实现双向数据传输
    git pull时 git cannot lock ref XXXXXX (unable to update local ref)错误解决方案
    三年内我的计划和方向
    关于云服务器和云部署的实操(新手级别入门)
    win7蓝屏死机0x0000003B错误蓝屏故障解决
    JAVA代码:生成一个集合,自定义大小,100以内的随机整数
  • 原文地址:https://www.cnblogs.com/ouym/p/14523990.html
Copyright © 2011-2022 走看看