1. 程式人生 > >jdk源碼之LockSupport

jdk源碼之LockSupport

排序 csdn 異常 object 多線程同步 面向 text 獲取對象 unsafe

前言/背景

在前面說到了UnSafe類,它給我提供了一個“後門”,讓我們可以直接操作內存,掛起線程等操作。這一講我們來看看LockSupport,顧名思義,它是給我們後面的LockSupport提供支持的。

概述

在我們過去的學習的,說起線程的掛起與恢復,我們就會想到wait與notify。在LockSupport中提供了另一個掛起(park)與恢復unpark線程的方式。兩者的區別如下

  • 語義上更符合。wait需要在sychronized代碼中才能調用,首先要獲得對象的監視鎖,即面向對象操作的掛起與恢復;而park是面向線程操作的掛起與恢復。
  • 使用上更靈活。wait操作我們需要先獲取對象的監視鎖;而park不需要,可以隨意進行park與unpark,unpark可以先於park調用。
  • interupt中斷不同。wait時如果收到中斷會拋出中斷異常,我們可以在catch處理;park的話,我們可以通過interrupted或isInterrupted去判斷線程是否中斷。

源碼/知識點

  • 內存分配:
    • 分配內存,重新分配內存,拷貝內存,釋放內存
    • 獲取內存地址,獲取內存地址指向的整數,將整數寫向指定的內存地址
  • 非常規實例化:不需要調用構造方法
  • 直接操作數組、普通對象、變量:可以通過指針、偏移量直接操作對象、變量
  • 多線程同步
    • monitorEnter、tryMonitorEnter、monitorExit
    • compareAndSwapObject、compareAndSwapInt、compareAndSwapLong
  • 線程的掛起和恢復:park與unpack方法
  • 內存屏障:用於避免指令重排序

總結

在我們的開發中不會直接使用到這個類,但在AQS、並發原子類,以及netty,kafaka底層實現中,都有這個類,所以了解學習這個開“後門”的類還是很有必要的。

參考鏈接

  • https://blog.csdn.net/opensure/article/details/53349698

jdk源碼之LockSupport