JAVA-初步認識-第十三章-死結樣本

來源:互聯網
上載者:User

標籤:線程   圖片   驗證   視頻   面試   java   blog   執行   http   

一.

接下來將的也是同步的一個小知識點,我們在使用同步的時候,會有這麼一種現象,死結。

什麼情況下,是鎖死?在我們程式當中,最常見的體現形式之一就是同步的嵌套。形象的說法是:兩個人各有一隻筷子,都想要吃飯,結果爭執之下,誰都吃不了。和諧的情況就是,筷子給對方,對方吃飯之後,再連自己的筷子一起還回來,我們再吃飯。

和諧的情況有,相持不下的情況也有。這種相持的情況就是死結,現在通過一個程式來驗證一下。

死結的一種體現形式之一,就是同步嵌套。

 現在是同步函數中包含由同步代碼塊,同步代碼塊中包含著同步函數,同步函數的鎖是this,同步代碼塊的鎖是obj。

(這裡我的疑問是兩個同步代碼塊是同一個麼?同步函數肯定是同一個)

 

流程是這樣的,一個線程進來,先執行同步代碼塊,先拿obj鎖,拿完鎖就進來了。一進來又多了一個同步,這同步是同步函數,鎖是this。這就是兩鎖,obj裡面有個this。接著往下看,一個線程在讀同步函數的時候,先拿this,this裡面有誰,obj吧。這就是兩個鎖在嵌套。

接著就執行一下,

DOS結果顯示直接卡在那兒了。再多次編譯運行,還有全部交替輸出的,那就是和諧的。

甚至還有直接掛掉的。

主線程睡10毫秒時,0線程就拿到了cpu執行權,當主線程醒了之後,就繼續執行t.flag=false; t2.start();

當0線程得到執行權時,衝進來拿到同步代碼塊的obj鎖,緊接著到show方法裡拿this鎖,然後讀show函數,接著又進入同步代碼塊,讀裡面的內容,if裡面的語句讀了三句,100~98。緊跟著t2這個線程也要準備要讀了,(它是按false進入的),是讀else。這個0線程有可能出了object了,還沒等出這show呢,t2線程就拿到了show所帶有的this鎖。它一拿到this鎖,就進入show函數,而0線程拿著this,(也就是說0線程拿著在同步代碼塊的聲明那,拿著obj想要進調用show函數的this,而1線程在show函式宣告那,拿著this,想要進同步代碼塊拿obj),互相都不放,且都拿著自己的鎖,誰都不放,誰都進不去,這種就是死結。→我覺著這個爭奪和執行權在誰手裡有什麼必要聯絡嗎?我是說,沒有cpu執行權也能握有鎖不放?

如果一個線程拿到鎖,又出去了,全釋放了。第二個線程接著進來,這就比較和諧了。

這是為了告訴大家,盡量不要設成死結,這樣問題不好解決。

二.

現在給大家介紹一個死結程式,面試多線程的時候會碰到,請給我寫個死結程式。

寫一個簡單點的死結程式。(遵循原則就一個嵌套)

標記是鎖的意思嗎?

本例中兩個嵌套的是同步代碼塊,(為什麼不採用同步函數呢?),同時為這個兩個同步代碼塊製備兩個鎖。

MyLock類中,對象locka前面的修飾符final是什麼意思?

感覺上面的MyLock類中的定義挺奇怪的,到底是函數還是變數?由於是鎖,肯定是函數,但是為什麼這麼寫?

突然想到鎖,或者同步,感覺邏輯很差,視頻在講解的時候,很多時候是自己構建了特點的環境。有沒有對於同步更確切的描述呢?

以前說線程任務的時候,是一個對象(多個線程操作同一個任務),這裡為什麼new了兩個線程任務呢?

 兩個線程執行路徑,只能是兩個任務,但是這並不影響我去示範,為什麼呢?我們這兩個線程啟動並執行都是run方法,而這flag,雖然我這兩個對象都有自己的flag,但是它們的值也是固定的,一個是true,另一個是false。

只有這種情況發生多個任務無所謂,因為你執行要麼是true,要麼是false,只有這兩種情況。

我這線程任務裡封裝的資源是boolean型變數,雖然這個變數在兩個任務對象當中都有獨立的一份,但是取得值只能是兩個,要麼是真,要麼是假。如果這裡寫的不是flag,而是num,int num=100,那就廢了,這會導致兩個線程任務執行的是兩個100。

我們也可以不調用建構函式,那就要先給flag一個值,先滿足一個值,然後再切換。

現在設想的這個程式能夠鎖上嗎?

從DOS結果看,就是鎖住了,一個線程拿到了locka的鎖,輸出了“if  locka.....”,但是沒拿到lockb鎖,因此進不來下一步。而另一個線程拿到了lockb鎖,輸出了“if  lockb.....”,但是沒有locka鎖。最終的結果就是另個輸出語句。

也可以將線程的名稱輸出,

DOS結果也顯示的死結。但是相同的這個程式換個cpu來執行,也許就和諧了。因此為了更大機率的出現我們需要展示的死結線程,我們設定迴圈語句,執行的次數增加,自然出現死結的機率就變大了。

前面書寫的while(true),可能是一直迴圈,在後台列印時強制停止。

DOS結果顯示,有鎖死也有和諧,而且我們剛才說的while(true)可能就是意味著多次迴圈。

 

JAVA-初步認識-第十三章-死結樣本

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.