JAVA中的各種鎖以及最優的zookeeper分散式鎖解決方案
一、鎖出現的原因-執行緒或者程序競爭資源
當有一個或者多個執行緒或者程序進行操作時,其他執行緒或者程序都不可以對這個資源進行操作,直到該執行緒或者程序完成操作,其他執行緒或者程序才能對該資源進行操作,而其他執行緒或程序都處於等待狀態。
二、執行緒同步的方式和機制
1、解決資源競爭問題
(1)臨界區:通過對多執行緒的序列化來來訪問公共資源或者而一段程式碼
- Synchronized修飾的java方法
(2)互斥量:採用互斥物件機制,只有擁有互斥對性的執行緒才能訪問
- Synchronized修飾的程式碼塊
- 分散式鎖的只要實現機制
2、解決執行順序
訊號量:他允許對個任務在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目。
CountDownLatch,CyclicBarrier和semaphore
三、分散式鎖實現的技術
1、基於資料庫實現分時鎖
(1)效能較差,容易出現單點故障
(2)鎖沒有失效時間,容易死鎖
(3)非阻塞式
樂觀鎖
2、基於快取實現分散式鎖
(1)所沒有失效時間
(2)非阻塞式
3、基於Zookeeper實現分散式鎖
(1)實現比較簡單
(2)可靠性高
(3)效能較好
四、ZooKeeper簡介
ZooKeeper是一個分散式,開放原始碼的分散式應用程式協調服務,是Hadoop和HBASE的重要元件,在zookeeper中,znode是一個跟Unix或者Windows檔案系統路徑相似的節點,可以往這個節點儲存或者獲取資料
特點:
1、在zookeeper中,znode是一個跟unix或windows檔案系統相似的節點,可以往這個節點儲存或者獲取資料
2、通過客戶端可以對znode進行增刪改查操作,還可以註冊watcher監控znode的變化
3、znode跟檔案系統一樣,名稱不可以重複(同一個znode下,節點名稱唯一)
zookeeper節點型別:
持久節點(persistent)
持久順序節點(persistent_sequential)
臨時節點(ephemeral)
臨時順序節點(ephemeral_sequential)
zookeeper典型應用場景:
1、資料釋出訂閱
2、負載均衡
3、命名服務
4、分散式協調
5、叢集管理
6、配置管理
7、分散式佇列
8、分散式鎖
場景描述:再線上程高併發下,生產一定業務含義的唯一訂單編號,如:2018-04-16-16-31-50-01,年月日時分秒序號,目的就是保證高併發狀態下每一個使用者建立的訂單唯一