多執行緒同步之LockSupport
阿新 • • 發佈:2019-02-16
多執行緒同步的方式有很多種,synchronized,wait/notify,lock/condition等,這裡介紹一下 LockSupport。
對於傳統的wait/notify這種比較low的做法,1,要自己維護一套鎖物件;2,必須在同步程式碼塊中使用,3,無法控制兩者之間執行順序導致有時候會形成阻塞情況,4,開銷比較大。
先來一個LockSupport的Demo吧:
相比於wait/notify的方式要簡單很多(這種方式的程式碼就不展示了),而且不管執行多少次都不會出現阻塞的情況。
LockSupport優勢:
①LockSupport不需要在同步程式碼塊裡 。所以執行緒間也不需要維護一個共享的同步物件了,實現了執行緒間的解耦。
②unpark函式可以先於park呼叫,所以不需要擔心執行緒間的執行的先後順序。
接下來看一個題:
題目:
* 已知陣列 A 內容為1、2、3、4...52,陣列 B 內容為 26 個英文字
* 母,使用兩個執行緒分別輸入兩個陣列,然後使程式執行列印內容為
* 12a34b56c78e... 的規律,請給出程式碼實現?
最傳統的做法就是使用wait/notify了,但是也是最low的,介紹兩個比較有優勢的方式。
方案一:自旋鎖 yield
定義兩個實現Thread的類,一個負責列印數字,一個負責列印字元
PrintNumbers:
PrintChars:
測試:
方案二:LockSupport
PrintNumbers:
PrintChars
測試:
多執行緒同步問題是比較複雜的問題,多瞭解一些方式總是好的,這裡就小酌一杯。