public class Test {
public static void main(String[] args) {
Test test=new Test();
test.test();
}
public void test(){
LockSupport.park(); //LockSupport.park(this);
}
}
后者输出多了一段wait时间,即调用了park方法后的内部信息。为什么呢?我们来分析源码:
如下代码中在调用Unsafe的方法中设置了blocker,在被唤醒后会清除这个bolcker对象,初步推测这是个线程的成员变量,所以可以获取内部信息并且在使用完后要释放内存。最后调用的方法中传入了当前线程和blocker实例(传入的Test对象),
parkBlockerOffset在LockSupport类中有一个静态变量是用来保存传入的变量引用的。通过它可以保存更多堆栈信息,可以得知线程被阻塞后发生的事情。
public static void park(Object blocker) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
UNSAFE.park(false, 0L);
setBlocker(t, null);
}
private static void setBlocker(Thread t, Object arg) {
// Even though volatile, hotspot doesn't need a write barrier here.
UNSAFE.putObject(t, parkBlockerOffset, arg);
}
protected final boolean tryReleaseShared(int unused) {
..............
for (;;) {
int c = getState();
int nextc = c - SHARED_UNIT;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}