zoukankan      html  css  js  c++  java
  • Java多线程系列--“JUC锁”07之 LockSupport

    概述

    本章介绍JUC(java.util.concurrent)包中的LockSupport。内容包括:
    LockSupport介绍
    LockSupport函数列表
    LockSupport参考代码(基于JDK1.7.0_40)
    LockSupport示例

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3505784.html

    LockSupport介绍

    LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。
    LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。
    因为park() 和 unpark()有许可的存在;调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。

    LockSupport函数列表

    复制代码
    // 返回提供给最近一次尚未解除阻塞的 park 方法调用的 blocker 对象,如果该调用不受阻塞,则返回 null。
    static Object getBlocker(Thread t)
    // 为了线程调度,禁用当前线程,除非许可可用。
    static void park()
    // 为了线程调度,在许可可用之前禁用当前线程。
    static void park(Object blocker)
    // 为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用。
    static void parkNanos(long nanos)
    // 为了线程调度,在许可可用前禁用当前线程,并最多等待指定的等待时间。
    static void parkNanos(Object blocker, long nanos)
    // 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
    static void parkUntil(long deadline)
    // 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
    static void parkUntil(Object blocker, long deadline)
    // 如果给定线程的许可尚不可用,则使其可用。
    static void unpark(Thread thread)
    复制代码

    LockSupport参考代码(基于JDK1.7.0_40)

    LockSupport.java的源码如下:

    View Code

    说明:LockSupport是通过调用Unsafe函数中的接口实现阻塞和解除阻塞的。

    LockSupport示例

    对比下面的“示例1”和“示例2”可以更清晰的了解LockSupport的用法。

    示例1

    复制代码
     1 public class WaitTest1 {
     2 
     3     public static void main(String[] args) {
     4 
     5         ThreadA ta = new ThreadA("ta");
     6 
     7         synchronized(ta) { // 通过synchronized(ta)获取“对象ta的同步锁”
     8             try {
     9                 System.out.println(Thread.currentThread().getName()+" start ta");
    10                 ta.start();
    11 
    12                 System.out.println(Thread.currentThread().getName()+" block");
    13                 // 主线程等待
    14                 ta.wait();
    15 
    16                 System.out.println(Thread.currentThread().getName()+" continue");
    17             } catch (InterruptedException e) {
    18                 e.printStackTrace();
    19             }
    20         }
    21     }
    22 
    23     static class ThreadA extends Thread{
    24 
    25         public ThreadA(String name) {
    26             super(name);
    27         }
    28 
    29         public void run() {
    30             synchronized (this) { // 通过synchronized(this)获取“当前对象的同步锁”
    31                 System.out.println(Thread.currentThread().getName()+" wakup others");
    32                 notify();    // 唤醒“当前对象上的等待线程”
    33             }
    34         }
    35     }
    36 }
    复制代码

    示例2

    复制代码
     1 import java.util.concurrent.locks.LockSupport;
     2 
     3 public class LockSupportTest1 {
     4 
     5     private static Thread mainThread;
     6 
     7     public static void main(String[] args) {
     8 
     9         ThreadA ta = new ThreadA("ta");
    10         // 获取主线程
    11         mainThread = Thread.currentThread();
    12 
    13         System.out.println(Thread.currentThread().getName()+" start ta");
    14         ta.start();
    15 
    16         System.out.println(Thread.currentThread().getName()+" block");
    17         // 主线程阻塞
    18         LockSupport.park(mainThread);
    19 
    20         System.out.println(Thread.currentThread().getName()+" continue");
    21     }
    22 
    23     static class ThreadA extends Thread{
    24 
    25         public ThreadA(String name) {
    26             super(name);
    27         }
    28 
    29         public void run() {
    30             System.out.println(Thread.currentThread().getName()+" wakup others");
    31             // 唤醒“主线程”
    32             LockSupport.unpark(mainThread);
    33         }
    34     }
    35 }
    复制代码

    运行结果

    main start ta
    main block
    ta wakup others
    main continue

    说明:park和wait的区别。wait让线程阻塞前,必须通过synchronized获取同步锁。

  • 相关阅读:
    Python批量修改文件后缀脚本
    IOS开发(62)之GCD上异步执行非UI任务
    创业遐想:三千世界 致在桥上看风景的你
    院长谈读书的方法(部门图书互换活动)
    树形dp hdu4514 湫湫系列故事——设计风景线
    设计模式之strategy模式(C++实现)
    拿什么拯救你,我的大规模杀伤性武器Nokia!
    C++成员函数的重载,继承,覆盖和隐藏
    ORA00600: internal error code, arguments: [4194] ,ORA00607
    wing ide 4.0/4.1超简单破解方法
  • 原文地址:https://www.cnblogs.com/wzyxidian/p/5302932.html
Copyright © 2011-2022 走看看