线程并发类实现工具--LockSupport

1.介绍

LockSupport是创建锁及其他线程同步工具的基本工具类。

  1. 对一个线程调用park()方法判断是否有许可,如果有,立即返回执行。否则继续阻塞。
  2. 对一个线程调用unpark()方法时:如果当前没有许可,则产生一个许可。否则不再产生许可(许可不可增加)。

与Thread.suspend和Thread.resume方法的比较
1. park()方法将返回如果线程被中断(Uninterrupted)
2. park()方法支持超时机制
3. 一个线程它有可能在别的线程unPark之前,或者之后,或者同时调用了park,那么因为park的特性,它可以不用担心自己的park的时序问题,否则,如果park必须要在unpark之前,那么给编程带来很大的麻烦
4. unpark函数可以先于park调用。比如线程B调用unpark函数,给线程A发了一个“许可”,那么当线程A调用park时,它发现已经有“许可”了,那么它会马上再继续运行。

2. 方法介绍

2.1 线程挂起
public static void park(Object blocker) {
    Thread t = Thread.currentThread();
    setBlocker(t, blocker);
    UNSAFE.park(false, 0L);
    setBlocker(t, null);
}
public static void park() {
    UNSAFE.park(false, 0L);
}

setBlocker(t, blocker) 方法

park 还各自支持一个 blocker 对象参数。此对象在线程受阻塞时被记录,==以允许监视工具和诊断工具确定线程受阻塞的原因==。(这样的工具可以使用方法 getBlocker(java.lang.Thread) 访问 blocker。)建议最好使用这些形式,而不是不带此参数的原始形式。在锁实现中提供的作为 blocker 的普通参数是 this。

private static void setBlocker(Thread t, Object arg) {
    // Even though volatile, hotspot doesn't need a write barrier here.
    UNSAFE.putObject(t, parkBlockerOffset, arg);
}

这里写图片描述

2.2挂起线程恢复
public static void unpark(Thread thread) {
    if (thread != null)
        UNSAFE.unpark(thread);
}

参考:

1.线程并发类实现工具–unsafe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值