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

  • 相关阅读:
    Android——监听事件OnLongClickListener
    Android——edittext的几个属性
    源码安装Postgresql9.4.1
    添加产品唯一性限制以后,复制按钮不能使用
    [转载]git 忽略某些文件
    grep 命令搜索 带空格的字符
    听故事学会计笔记
    利用Python的三元表达式解决Odoo中工资条中城镇、农村保险的问题
    8.0 Qweb 报表编写步骤
    Buff系统
  • 原文地址:https://www.cnblogs.com/ouym/p/14523990.html
Copyright © 2020-2023  润新知