1.介绍
LockSupport是创建锁及其他线程同步工具的基本工具类。
- 对一个线程调用park()方法判断是否有许可,如果有,立即返回执行。否则继续阻塞。
- 对一个线程调用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);
}
参考: