[ChatXServer開發筆記]2019.01.28
未登入的客戶端執行緒池
採用單例模式(Singleton Parttern)設計未登入的客戶端執行緒池 ,採用靜態內部類的形式保證其執行緒安全。之所以靜態內部類能夠保證單例模式的執行緒安全,是因為Java在底層針對類的載入已經做了同步處理,已經是執行緒安全的了。
這種方式的優點:
- 懶載入,只有在需要的時候進行載入,節省資源
- 在多執行緒共享使用一個單例時,確保執行緒安全
關於執行緒安全下的單例模式的使用,參考文章:http://blog.ihuxu.com/java-singleton-pattern-usages-for-thread-safe/
客戶端執行緒池的主要資料結構
基於連結串列的阻塞佇列(Linked Blocking Queue)
需要宣告一個數據結構來存放“未登入的客戶端”(以下簡稱“資料”),對於其中的“資料”操作有如下特點:
- 先加入的“資料”優先處理,後加入的“資料”次級處理
- 加入的資料量要有一定的限制
- 獲取資料時,如果有那麼返回,如果沒有就阻塞住,直到有資料時再返回
- 新增資料時,如果容量已經達到上限,那麼久阻塞,並等待一定時間,如果在達到時間上限之前有可用容量,那麼新增資料;否則,報錯異常。
根據以上特點,採用BlockingQueue(阻塞佇列)協議實現的LinkedBlockingQueue來實現。這種佇列是執行緒安全的,以為底層針對他的操作時已經做了同步的機制。
客戶端執行緒的抽象化
打算按照客戶端的狀態將客戶端的執行緒進行抽象,比如登入狀態(LoggedClient),未登入狀態(NotLoggedClient)等等。
由此一來,需要構建一下客戶端的狀態流轉過程。這個狀態流轉用樹型資料結構進行儲存,好處在於:
- 能夠回溯當前客戶端整個證明週期的過程(如果有必要)
- 將狀態抽象成樹型的資料結構,容易理解整個生命週期
- 將狀態抽象成樹型的資料結構,可以針對不同分支下的同一個狀態進行差異化處理(樹型結構下,不同分支下的相同狀態會用不同的狀態碼錶示)
同時,也參考下狀態機的概念和實現方案:
有限狀態機(英語:finite-state machine,縮寫:FSM)又稱有限狀態 自動機 ,簡稱狀態機 ,是表示有限 個狀態 以及在這些狀態 之間的轉移和動作等行為的數學模型。
相關示例程式碼:https://github.com/elimisteve/fsm/blob/master/fsm.go狀態機設計
狀態值
狀態值用32位的有符號(int)整型表示,高8位代表所在的樹的深度(根的深度為0),低24位代表當前層級的序號(序號自增,從0開始)