Java多线程Day22-JUC锁之LockSupport

Posted 攻城狮Chova

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程Day22-JUC锁之LockSupport相关的知识,希望对你有一定的参考价值。

基本概念

  • LockSupport: 用来创建锁和其余的线程同步类的线程阻塞原语
  • LockSupport中的park() 是阻塞线程 ,unpark() 是解除阻塞线程
    • LockSupport中通过Unsafe函数中的接口实现线程阻塞和解除阻塞的
  • LockSupport中的park()unpark() 不会遇到Thread.suspendThread.resumed可能引发的死锁的问题
  • park()unpark() 之间存在许可,所以调用park() 的线程和另一个试图unpark() 线程之间的竞争将保持活性

LockSupport方法

getBlocker

/**
 * 获取提供给最近一次尚未解除阻塞的park方法调用的阻塞blocker对象
 * 如果park方法的调用已经解除阻塞,则返回null
 *  
 * @param t 当前线程
 * @return Object 阻塞blocker对象
 * @throw NullPointerException 如果当前参数线程为空则抛出空指针异常
 */
public static Object getBlocker(Thread t);

park

/**
 * 为了线程调度,禁用当前线程,除非许可可用
 */
public static void park();

/**
 * 为了线程调度,禁用当前线程,除非许可可用
 *  
 * @param blocker 当前线程的同步阻塞对象
 */
public static void park(Object blocker);

parkNanos

/**
 * 为了线程调度,禁用当前线程,最多等待指定的等待时间,除非许可可用
 *  
 * @param nanos 指定的最多的等待时间
 */
public static void parkNanos(long nanos);

/**
 * 为了线程调度,禁用当前线程,最多等待指定的等待时间,除非许可可用
 *  
 * @param blocker 当前线程的同步阻塞对象
 * @param nanos 指定的最多的等待时间
 */
public static void parkNanos(Object blocker, long nanos);

parkUtil

/**
 * 为了线程调度,在指定的截止时间前禁用当前线程,除非许可可用
 *  
 * @param deadline 指定的截止时间毫秒值
 */
public static void parkUntil(long deadline);

/**
 * 为了线程调度,在指定的截止时间前禁用当前线程,除非许可可用
 *  
 * @param blocker 当前线程的同步阻塞对象
 * @param deadline 指定的截止时间毫秒值
 */
public static void parkUntil(Object blocker, long deadline);

unpark

/**
 * 如果给定的线程的许可不可用,则使得给定的线程的许可可用
 *  
 * @param thread 给定的线程,可以为空
 */
public static void unpark(Thread thread);

示例

  • LockSupport的唤醒和阻塞示例
  • park和wait比较:
    • park使得线程阻塞前,不需要通过synchronized获取同步锁
    • wait使得线程阻塞前,必须通过通过synchronized获取同步锁

以上是关于Java多线程Day22-JUC锁之LockSupport的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程Day23-JUC锁之共享锁

Java多线程Day21-JUC锁之Condition条件

Java多线程Day21-JUC锁之Condition条件

详解Java多线程锁之synchronized

多线程编程-- part5.1 互斥锁之公平锁-获取锁

多线程编程-- part5.1 互斥锁之公平锁-释放锁