Java并发编程 LockSupport源码分析
生活随笔
收集整理的這篇文章主要介紹了
Java并发编程 LockSupport源码分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這個類比較簡單,是一個靜態類,不需要實例化直接使用,底層是通過java未開源的Unsafe直接調用底層操作系統來完成對線程的阻塞。
1 package java.util.concurrent.locks; 2 import java.util.concurrent.*; 3 import sun.misc.Unsafe; 4 5 6 public class LockSupport { 7 private LockSupport() {} 8 9 //這個類是java未開源的類,直接調用底層操作系統 10 private static final Unsafe unsafe = Unsafe.getUnsafe(); 11 //記錄線程對象中parkBlocker字段的位置 12 private static final long parkBlockerOffset; 13 14 static { 15 try { 16 parkBlockerOffset = unsafe.objectFieldOffset 17 (java.lang.Thread.class.getDeclaredField("parkBlocker")); 18 } catch (Exception ex) { throw new Error(ex); } 19 } 20 21 private static void setBlocker(Thread t, Object arg) { 22 // Even though volatile, hotspot doesn't need a write barrier here. 23 //將org設置到線程的parkBlocker字段上 24 //這樣方便在測試的時候知道線程在什么地方阻塞 25 unsafe.putObject(t, parkBlockerOffset, arg); 26 } 27 28 //調用底層操作系統解鎖線程 29 public static void unpark(Thread thread) { 30 if (thread != null) 31 unsafe.unpark(thread); 32 } 33 34 //設置blocker并且鎖定線程 35 public static void park(Object blocker) { 36 Thread t = Thread.currentThread(); 37 setBlocker(t, blocker); 38 unsafe.park(false, 0L); 39 setBlocker(t, null); 40 } 41 42 //設置blocker并且并且阻塞線程nanos納秒 可以這么轉換成毫秒 43 //TimeUnit timeUnit = TimeUnit.MILLISECONDS; 44 //LockSupport.parkNanos(timeUnit.toNanos(3000)); 45 public static void parkNanos(Object blocker, long nanos) { 46 if (nanos > 0) { 47 Thread t = Thread.currentThread(); 48 setBlocker(t, blocker); 49 unsafe.park(false, nanos); 50 setBlocker(t, null); 51 } 52 } 53 54 //設置blocker并且阻塞線程多少毫秒 55 //注意這里的時間需要使用系統時間加上需要等待的時間 56 //LockSupport.parkUntil(System.currentTimeMillis() + 3000); 57 public static void parkUntil(Object blocker, long deadline) { 58 Thread t = Thread.currentThread(); 59 setBlocker(t, blocker); 60 unsafe.park(true, deadline); 61 setBlocker(t, null); 62 } 63 64 //獲得線程阻塞時設置的Blocker 65 public static Object getBlocker(Thread t) { 66 if (t == null) 67 throw new NullPointerException(); 68 return unsafe.getObjectVolatile(t, parkBlockerOffset); 69 } 70 71 //阻塞線程 72 public static void park() { 73 unsafe.park(false, 0L); 74 } 75 76 public static void parkNanos(long nanos) { 77 if (nanos > 0) 78 unsafe.park(false, nanos); 79 } 80 81 public static void parkUntil(long deadline) { 82 unsafe.park(true, deadline); 83 } 84 }?
寫一個簡單DEMO,這個類使用起來也很簡單,一般很少直接使用,java.util.concurrent包里有很多鎖的實現都是基于此類,后續我們會講到。
1 public static void main(String[] args) { 2 3 final Thread mainThread = Thread.currentThread(); 4 5 Thread thread = new Thread(new Runnable() { 6 @Override 7 public void run() { 8 System.out.println("3秒后解鎖主線程"); 9 try { 10 Thread.sleep(3000); 11 LockSupport.unpark(mainThread); 12 } catch (InterruptedException e) { 13 e.printStackTrace(); 14 } 15 } 16 }); 17 thread.start(); 18 LockSupport.park(); 19 20 System.out.println("Demo.main()"); 21 }?
轉載于:https://www.cnblogs.com/daxin/p/3831403.html
總結
以上是生活随笔為你收集整理的Java并发编程 LockSupport源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写在阿里去IOE一周年
- 下一篇: 三星嵌入式开发平台 三星Cortex-A