1. 程式人生 > >多執行緒同步之LockSupport

多執行緒同步之LockSupport

多執行緒同步的方式有很多種,synchronized,wait/notify,lock/condition等,這裡介紹一下 LockSupport。

對於傳統的wait/notify這種比較low的做法,1,要自己維護一套鎖物件;2,必須在同步程式碼塊中使用,3,無法控制兩者之間執行順序導致有時候會形成阻塞情況,4,開銷比較大。

先來一個LockSupport的Demo吧:

Locksupport

相比於wait/notify的方式要簡單很多(這種方式的程式碼就不展示了),而且不管執行多少次都不會出現阻塞的情況。

LockSupport優勢:

  • ①LockSupport不需要在同步程式碼塊裡 。所以執行緒間也不需要維護一個共享的同步物件了,實現了執行緒間的解耦。

  • ②unpark函式可以先於park呼叫,所以不需要擔心執行緒間的執行的先後順序。

接下來看一個題:

題目:

 * 已知陣列 A 內容為1、2、3、4...52,陣列 B 內容為 26 個英文字
 * 母,使用兩個執行緒分別輸入兩個陣列,然後使程式執行列印內容為 
 * 12a34b56c78e... 的規律,請給出程式碼實現?

最傳統的做法就是使用wait/notify了,但是也是最low的,介紹兩個比較有優勢的方式。

方案一:自旋鎖 yield

定義兩個實現Thread的類,一個負責列印數字,一個負責列印字元

PrintNumbers:

PrintNUmbers

PrintChars:
PrintChars

測試:
測試

方案二:LockSupport

PrintNumbers:
PrintNumbers

PrintChars
PrintChars

測試:
測試

多執行緒同步問題是比較複雜的問題,多瞭解一些方式總是好的,這裡就小酌一杯。