LockSupport工具类的原理

LockSupport:编程工具类(工具类构造方法私有化),在java.util.concurrent.locks.LockSupport(jucl包下),
主要为了阻塞线程(part)和唤醒线程(unpart)时候使用。
主要方法:

public static void park(Object blocker); // 无限期暂停当前线程
public static void parkNanos(Object blocker, long nanos); // 暂停当前线程,不过有超时时间的限制,超过时间自动唤醒
public static void parkUntil(Object blocker, long deadline); // 暂停当前线程,直到某个(绝对)时间,过了这个时间自动唤醒
public static void park(); //与上面一样,少了blocker
public static void parkNanos(long nanos); //与上面一样,少了blocker
public static void parkUntil(long deadline); // 与上面一样,少了blocker
public static void unpark(Thread thread); // 恢复当前线程
public static Object getBlocker(Thread t);//获取线程的等待对象
private static void setBlocker(Thread t, Object arg)//标识当前线程的等待对象

设计原理核心:许可,而且许可只有一个,不能叠加。

part:挂起当前线程,等待一个许可
public static void park() {//U为Unsafe,sun没有开源的类
    		U.park(false, 0L);
	//调Unsafe.part,Unsafe.part,第一个参数:是否绝对时间。第二个参数为时间。这里的意思是挂起永久时间,等待unpart
	}

JDK1.6开始,一系列park方法开始支持传入blocker参数,标识当前线程在等待的对象,
当线程在没有持有许可证的情况下调用park方法而被阻塞挂起时,这个blocker对象会被记录到该线程内部。
jdk推荐我们使用有blocker参数的part,这样子可以知道、获取到阻塞对象。

unpart:为某个线程提供一个许可,也就是唤醒某个指定的线程。

part/unpart与wait/notify比较相似,但part/unpart具有以下优点:

1.part/unpart是以Thread为操作对象,语义更加直观;
2.操作更为精准、灵活,可以准确的去唤醒某个一个线程;

wait/notify和synchronized联系在一起的,wait过后,线程是进入阻塞(Blocked)状态。
part/unpart中part方法使当前线程挂起,进入等待(waiting)状态

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忆亦何为

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值