leetcode併發題解

2021-09-27 11:05:43 字數 2676 閱讀 7926

解法一:使用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 ...