併發編程模型小結

1. 臨界區加排他鎖(Go sync.Mutex.Lock())linux

若是併發量大,鎖競爭激烈,會致使性能開銷大數據庫

 

2. 讀多寫少場景,使用讀寫鎖(Go sync.Mutex.RLock())編程

支持併發讀,但寫鎖會block住讀和寫,讀多場景性能會好不少多線程

 

3. 對計數使用CAS操做(Go sync.atomic.CompareAndSwapInt64())併發

CAS由CPU原子指令實現。是一種無鎖結構,因爲消耗的CPU指令週期少,性能要優於鎖結構異步

 

4. actor併發模型性能

Erlang和scala akka使用的併發模型。通常併發線程通訊有兩種實現模型:共享內存和消息傳遞。共享內存最大的問題在於條件競爭,還容易產生死鎖等問題。atom

actor是一種消息傳遞實現併發模型,定義了actor,每一個actor有一個mail box,負責接收消息。消息只能順序的放到郵箱中,由actor處理線程

 

5. CSP模型scala

Golang使用的是CSP併發模型,與actor惟一區別是沒有mail box。代替使用channel進行消息傳遞,相似於linux的命名管道

 

6. SMT軟件事務內存

參考數據庫事務的實現,保證操做的ACID特性。經過內存日誌實現對共享資源操做的原子性,commit或abort。但因爲維護日誌的開銷,該模型的性能要低於鎖。但其優點是能夠極大簡化多線程編程模型,不會產生諸如死鎖等問題。

上述actor模型中,actor內部持有狀態,但異步消息傳遞意味着不能提供一致性的調用過程。對於交易系統,如銀行帳戶存款和提款的操做過程是須要是原子的,這可能須要跨兩個帳戶調用過程是一個原子過程,能夠由SMT實現

相關文章
相關標籤/搜索