写上一篇博客ReentrantLock相关的时候翻代码发现,线程启停的控制在jdk7中使用的是LockSupport实现的,于是忍不住想看下代码,然后愈发不可收拾,Locksupport借助的是POSIX线程的mutex和condition实现的线程间的启停控制。
先放下资源吧,我写博客的习惯就是好东西先放出来
IBM的同仁写的,IBM出品还是相当保障的,浅显易懂的把生涩的东西表达出来,很明了,其实这个部分看完POSIX的知识基本就有了,接下来翻下LockSupport的底层C++实现,具体看下如何使用POSIX实现的线程启停控制。
https://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/index.html
https://www.ibm.com/developerworks/cn/linux/thread/posix_thread2/index.html
https://www.ibm.com/developerworks/cn/linux/thread/posix_thread3/index.html
幸亏翻了,posix的这三篇IBM的系列文章,帮助很大,再来看LockSupport的底层代码生涩度就降低很多了。
LockSupport.java 里
public static void park(Object blocker) { Thread t = Thread.currentThread(); setBlocker(t, blocker); unsafe.park(false, 0L); setBlocker(t, null); }
setBlocker,设置线程对象的parkBlocker属性,实际在ReentrantLock中,指的是FariSync或者NofairSync 锁。
继续到unsafe.park(false, 0L),这个类就都不陌生了吧,go
public native void park(boolean var1, long var2);
进入原声方法调用:unsafe.cpp
UNSAFE_ENTRY(void, Unsafe_Park(JNIEnv *env, jobject unsafe, jboolean isAbsolute, jlong time)) UnsafeWrapper("Unsafe_Park"); HS_DTRACE_PROBE3(hotspot, thread__park__begin, thread->parker(), (int) isAbsolute, time); JavaThreadParkedState jtps(thread, time != 0); thread->parker()->park(isAbsolute != 0, time); HS_DTRACE_PROBE1(hotspot, thread__park__end, thread->parker()); UNSAFE_END
这里已经有些看不懂了,因为对java native的调用机制看过一点,没太深入这里就不聊了,进入代码两个java代码层过来的参数 jboolean isAbsolute, jlong time,
宏方法就不看了(老实说c++基本已经还给大学老师了),