LockSupport多看一点

写上一篇博客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++基本已经还给大学老师了),

猜你喜欢

转载自www.cnblogs.com/aquariusm/p/9267480.html