Java多线程Day22-JUC锁之LockSupport
Posted 攻城狮Chova
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程Day22-JUC锁之LockSupport相关的知识,希望对你有一定的参考价值。
基本概念
- LockSupport: 用来创建锁和其余的线程同步类的线程阻塞原语
- LockSupport中的park() 是阻塞线程 ,unpark() 是解除阻塞线程
- LockSupport中通过Unsafe函数中的接口实现线程阻塞和解除阻塞的
- LockSupport中的park() 和unpark() 不会遇到Thread.suspend和Thread.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的主要内容,如果未能解决你的问题,请参考以下文章