Java中線程同步鎖和互斥鎖有啥區別?看完你還是一臉懵逼?

Java中線程同步鎖和互斥鎖有啥區別?看完你還是一臉懵逼?

鎮樓小姐姐

可獲得兩大新人禮包

36份一線互聯網Java面試電子書

84個Java稀缺面試題視頻


首先不要鑽概念牛角尖。這樣沒意義。

也許java語法層面包裝成了sycnchronized或者明確的XXXLock,但是底層都是一樣的。無非就是哪種寫起來方便而已。

鎖就是鎖而已,避免多個線程對同一個共享的數據併發修改帶來的數據混亂。

鎖要解決的大概就只有這4個問題:

  • 誰拿到了鎖“這個信息存哪裡(可以是當前class,當前instance的markword,還可以是某個具體的Lock的實例)
  • 誰能搶到鎖的規則(只能一個人搶到 - Mutex;能搶有限多個數量 - Semphore;自己可以反覆搶 - 重入鎖;讀可以反覆搶到但是寫獨佔 - 讀寫鎖……)
  • 搶不到時怎麼辦(搶不到玩命搶;搶不到暫時睡著,等一段時間再試/等通知再試;或者二者的結合,先玩命搶幾次,還沒搶到就睡著)
  • 如果鎖被釋放了還有其他等待鎖的怎麼辦(不管,讓等的線程通過超時機制自己搶;按照一定規則通知某一個等待的線程;通知所有線程喚醒他們,讓他們一起搶……)

有了這些選擇,你就可以按照業務需求組裝出你需要鎖。

關於“互斥”和“同步”的概念

  • 答案很清楚了,互斥就是線程A訪問了一組數據,線程BCD就不能同時訪問這些數據,直到A停止訪問了
  • 同步就是ABCD這些線程要約定一個執行的協調順序,比如D要執行,B和C必須都得做完,而B和C要開始,A必須先得昨晚。

這是兩種典型的併發問題。恰當的使用鎖,可以解決同步或者互斥的問題。

你可以說Mutex是專門被設計來解決互斥的;Barrier,Semphore是專門來解決同步的。但是這些都離不開上述對上述4個問題的處理。同時,如果遇到了其他的具體的併發問題,你也可以定製一個鎖來滿足需要。

另外一個解釋或許能明白更多

所謂互斥,就是不同線程通過競爭進入臨界區(共享的數據和硬件資源),為了防止訪問衝突,在有限的時間內只允許其中之一獨佔性的使用共享資源。如不允許同時寫

同步關係則是多個線程彼此合作,通過一定的邏輯關係來共同完成一個任務。一般來說,同步關係中往往包含互斥,同時對臨界區的資源會按照某種邏輯順序進行訪問。如先生產後使用

總的來說,兩者的區別就是:

互斥是通過競爭對資源的獨佔使用,彼此之間不需要知道對方的存在,執行順序是一個亂序。

同步是協調多個相互關聯線程合作完成任務,彼此之間知道對方存在,執行順序往往是有序的。


分享到:


相關文章: