看了很多關於執行緒交替列印abc的,千奇百怪,有用鎖的,也有用原子操作的,還有用巢狀同步**塊的,實在是很沒有必要,演算法題追求的是簡短精煉,思想昇華。演算法題就是活到老學到老啦,下面就給大家介紹乙個最好的演算法思路。仔細看哦,不難理解。1.volatile關鍵字:多執行緒操作同乙個變數的時候,首先獲取這個變數,獲取操作不存在鎖,修改變數後在自己的暫存器中儲存,然後提交到主記憶體,只有重新整理到主記憶體,其他執行緒才能可見。暫存器是執行緒私有的,主記憶體是執行緒共享的。涉及到jvm了,這裡不再多說。
2.自旋鎖:不懂的小夥伴可以暫時理解為,乙個執行緒如果沒有獲取到鎖(監視器),就不斷地嘗試獲取,直到獲取成功。自旋鎖並不是一定要有鎖的出現,是一種思想,沒有鎖也可以實現,比如cas。
public
class
main
extends
thread
@override
public
void
run()}
}public
static
void
main
(string[
] args)
}
1、這套演算法維護了乙個state狀態值,防止多執行緒不斷修改state造成混亂。保證state的值對於多個執行緒一定是一樣的,不存在髒資料。state2、我們選擇**最少化的思想,用最大的main類直接繼承thread。然後再main方法中啟動三個執行緒,並且通過構造方法傳入乙個type值,type有兩個作用:1.辨識不同的執行緒
2.指向字串"abc"的字元下標。表示這個執行緒要輸出哪乙個字元。 string類底層是用字元陣列(final char value)實現的,不懂的去看原始碼,很簡單。
3、最核心的地方在這裡,我們使用了for迴圈替代while迴圈。原因就是使用for+if模擬自旋鎖,我們可以注意到for迴圈的判斷條件之後,我們並沒有寫i++,因為我們只有在成功的情況下才能使i自增,否則會白白浪費一次迴圈,這樣就達到了不斷重試的目的,保證每個執行緒無論重試多少次,最終一定要使i達到9。保證自己要輸出的那個字元一定是10次。
4、還要注意的地方是,我們new了三個例項,這三個例項有自己的type,但是state和name是三者共享的,因為它們都被static關鍵字修飾,只會被載入一次到記憶體中。這樣就達到了維護的目的。
type
abc的取值00
a11b
22c3
0a41
b52c
三個執行緒ABC,交替列印ABC
問題為三線程間的同步喚醒操作,主要的目的就是threada threadb threadc threada 迴圈執行三個執行緒。為了控制線程執行的順序,那麼就必須要確定喚醒 等待的順序,所以每乙個執行緒必須同時持有兩個物件鎖,才能繼續執行。乙個物件鎖是prev,就是前乙個執行緒所持有的物件鎖。還有乙...
三個執行緒交替順序列印ABC
建立三個執行緒a b c,a執行緒列印10次字母a,b執行緒列印10次字母b,c執行緒列印10次字母c,但是要求三個執行緒同時執行,並且實現交替列印,即按照abcabcabc的順序列印。解決辦法 使用synchronized,wait和notifyall 思路 使用同步塊和wait notify的方...
建立三個執行緒,分別列印 a,b,c
建立三個執行緒,分別列印 a,b,c.現在要求用訊號量對執行緒進行同步,無論程式執行 多少次 如何執行,都能使整個程式依次列印 a b c a b c a b c 一直死迴圈 include include include include include include include includ...