當前位置:
首頁 > 知識 > 從線程間通信看到的關於基本類型封包的問題

從線程間通信看到的關於基本類型封包的問題

本文描述了在某種特殊場景下JDK編譯器對Java的基本類型的封包操作。

其原理非常簡單,但是現象卻非常非常的迷惑人。可以讓我們從另外一個角度看待JDK對基本類型的封包。

本文代碼的原意是想找到一種當未來超時後,可以盡量快的終止掉還在運行的未來(事實上,未來超時後(在主線程拋出超時異常後),未來的線程並不會停止,直到它運行結束,自然消亡。)

先上代碼:

主函數:

再看TestThread類:

最後是輔助豆

猜猜列印的結果是啥?

注意紅色和藍色部分。

變數ISC1的值:假

變數ISC1通過的ThreadLocal的獲取的值:假

變數ISC2的值:假

變數ISC2通過的ThreadLocal的獲取的值:假

變數ISC3的值:thread.InteruptTest.RichBoolean@5740bb

變數ISC3通過的ThreadLocal的獲取的值:thread.InteruptTest.RichBoolean@5740bb

1

變數ISC1的值:假

變數ISC1通過ThreadLocal的獲取的值:假

變數ISC2的值:假

變數ISC2通過ThreadLocal的獲取的值:假

變數ISC3的值:thread .InteruptTest.RichBoolean @ 5740bb

變數ISC3通過ThreadLocal的獲取的值:thread.InteruptTest.RichBoolean@5740bb

2

變數ISC1的值:假

變數ISC1通過ThreadLocal的獲取的值:假

變數ISC2的值:假

變數ISC2通過ThreadLocal的獲取的值:假

變數ISC3的值:thread.InteruptTest.RichBoolean@5740bb

變數ISC3通過ThreadLocal的獲取的值:thread.InteruptTest.RichBoolean@5740bb

3

變數ISC1的值:假

變數ISC1通過ThreadLocal的獲取的值:假

變數ISC2的值:假

變數ISC2通過的ThreadLocal的獲取的值:假

變數ISC3 值:thread.InteruptTest.RichBoolean@5740bb

變數ISC3通過ThreadLocal的獲取值:thread.InteruptTest.RichBoolean@5740bb

4

變數ISC1的值:假

變數ISC1通過ThreadLocal的獲取的值:假

變數ISC2的值:假

變數ISC2通過ThreadLocal的獲取值:假

超時拉

變數ISC3的值:thread.InteruptTest.RichBoolean@5740bb

變數ISC3通過ThreadLocal中獲取的值:thread.InteruptTest.RichBoolean@5740bb

5

變數ISC1的值:真正的

變數ISC1通過ThreadLocal中獲取的值:假

變數ISC2的值:真正的

變數ISC2通過ThreadLocal中獲取的值:假

變數ISC3的值:thread.InteruptTest.RichBoolean@5740bb

變數ISC3通過ThreadLocal中獲取的值:thread.InteruptTest.RichBoolean @ 5740bb

6

變數ISC1的值:真正的

變數isC1通過ThreadLocal獲取的值:false

變數isC2的值:true

變數isC2通過ThreadLocal獲取的值:false

變數isC3的值:thread.InteruptTest.RichBoolean@5740bb

變數isC3通過ThreadLocal獲取的值:thread.InteruptTest.RichBoolean@574 0bb

想想為什麼ISC1,ISC2中,未來自身的變數變為了真實而他們對應的ThreadLocal中的中的值卻還是假???????

難道是線程之間不能使用這種方式訪問同一個變數?

那為什麼ISC3又是和我們想想的一樣的?

其實仔細推導後發現原理非常簡單

看看 DivideFuture.class

內層的紅色框中說明,我們取消時是將ISC2的變數重新賦值了,也就是說ISC2指向了一個新的對象而thISC2裡面還是老的值,所以他們列印出來的結果不同。

同理,ISC1 =真正的這句話因為jdk的封包操作的原因類似ISC2也是重新新增了一個對象,ISC1指向了新對象,而thISC1中還是老對象。現象雖小,追逐根源的過程,才是我們成長的來源。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java吧 的精彩文章:

了解CMSConcurrentMark-Sweep
Java常見的面試問題,帶答案,自己答出來多少?
Java培訓學習從零開始?怎麼樣?
Java 基礎之走進JAVA!

TAG:java吧 |

您可能感興趣

窗帘軌道的基本類型
關於程序設計的一些基本原則
網頁設計有哪些基本流程以及需要注意的問題
眉型的基本線條以及它們的幾種組合方式
二、哲學的基本問題是思維和存在的關係問題
知識點!關於挖礦的基本問題
關山月論畫:有關中國畫基本訓練的幾個問題
架構心靈方程式的三個基本要素
網路的一些基本概念
以一種獨特的繪畫語言去表現人類的基本關係
關於利物浦的詳細分析:既是新嘗試,也是還原基本陣型?
對程序員的基本禮儀
從標題到寫作流程:寫好一篇論文的10條基本原則!
你必須知道的基本數據類型之二
看節目時備好紙筆,是對《明星大偵探》最基本的尊重
明人不說暗話!有關寵物魚缸濾材的基礎知識,基本都藏在這裡了!
情侶之間,這四個問題不要輕易去「觸碰」,要給對方最基本的尊重
關於明暗物質交界面的幾個基本點的猜測
今天說一說電腦的三個重要的的基本部件
結繩的基本符號和製作過程圖