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

  • 相关阅读:
    Python第二十天 shutil 模块 zipfile tarfile 模块
    SQL Server中SET QUOTED_IDENTIFIER的使用
    SQL Server AG集群启动不起来的临时自救大招
    检查使用共享表空间的表
    数据库历史简图
    线上centos6出现软死锁 kernel:BUG: soft lockup
    ORA-01810:格式代码出现两次 解决方法
    C# DES (ECB模式) 加密解密 --单倍长
    Android-ContentProvider使用
    第十三周(动物这样叫)
  • 原文地址:https://www.cnblogs.com/ouym/p/14523990.html
Copyright © 2011-2022 走看看