日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发编程 LockSupport源码分析

發布時間:2025/7/14 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。