解法一:使用volatile
public
class
foowithvolatile
public
void
first
(runnable printfirst)
throws interruptedexception
public
void
second
(runnable printsecond)
throws interruptedexception
printsecond.
run();
count++;}
public
void
third
(runnable printthird)
throws interruptedexception
// printthird.run() outputs "third". do not change or remove this line.
printthird.
run();
}}
類似的,我們也可以使用atomicinteger,不過其實atomicinteger底層也是使用了volatile欄位,只不過在計算時會使用cas解決原子性問題,但是這裡的while迴圈對自增操作進行了阻塞,所以不會出現三個執行緒同時對count自增的情況,所以沒必要使用atomicinteger,更何況cas操作裡面的while迴圈也是很耗費資源的解法二:使用countdownlatch
public
class
foowithcountdownlatch
public
void
first
(runnable printfirst)
throws interruptedexception
public
void
second
(runnable printsecond)
throws interruptedexception
public
void
third
(runnable printthird)
throws interruptedexception
}
類似的,這裡我們使用兩個「門栓」栓住(阻塞)second方法和third方法執行run方法列印結果,當first方法執行完畢後,釋放second的門栓讓second方法列印結果,second方法執行完畢後,釋放third的門栓讓third方法列印結果
class
foobarwithcountdownlatch
public
void
foo(runnable printfoo)
throws interruptedexception
}public
void
bar(runnable printbar)
throws interruptedexception
}}
這裡要注意,countdownlatch和cyclicbarrier不一樣,countdownlatch是一次性的,countdown到0之後不會自己恢復成1,所以要每次new乙個countdownlatch物件。
public
class
zeroevenodd
// printnumber.accept(x) outputs "x", where x is an integer.
public
void
zero
(intconsumer printnumber)
throws interruptedexception
else}}
public
void
even
(intconsumer printnumber)
throws interruptedexception
}public
void
odd(intconsumer printnumber)
throws interruptedexception
}}
這道題沒什麼好說的,做法也同樣很多樣,只要仔細點,都可以做對,但是我感覺都沒直接用coutdownlatch好。
public
class
h2opublic
void
hydrogen
(runnable releasehydrogen)
throws interruptedexception
public
void
oxygen
(runnable releaseoxygen)
throws interruptedexception
}
實在想不到semaphore以外的做法,雖然看題解確實有,但是反而不怎麼好
Leetcode 題解 排序
桶排序 荷蘭國旗問題 用於求解kth element問題,也就是第 k 個元素的問題。可以使用快速排序的 partition 進行實現。需要先打亂陣列,否則最壞情況下時間複雜度為 o n2 用於求解topk elements問題,也就是 k 個最小元素的問題。使用最小堆來實現 topk 問題,最小堆...
LeetCode演算法題解答
leetcode演算法題解答 第四題 尋找兩個有序陣列的中位數 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。def findmedianso...
Leetcode 題解 雙指標
雙指標 有序陣列 字串翻轉 環形鍊錶問題 雙指標主要用於遍歷陣列,兩個指標指向不同的元素,從而協同完成任務。有序陣列的 two sum1 leetcode 167.two sum ii input array is sorted easy input numbers target 9 output ...