jdk源碼之LockSupport
阿新 • • 發佈:2018-07-10
排序 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