1. 程式人生 > 其它 >原來大廠的Redis分散式鎖都這麼設計的!已開源

原來大廠的Redis分散式鎖都這麼設計的!已開源

原來大廠的Redis分散式鎖都這麼設計的!已開源

Java就是個多執行緒的世界

1. 類的執行緒安全

我們經常說類是執行緒安全的,類是執行緒不安全的。那麼什麼樣的類才是執行緒安全的?

1.1 定義

多執行緒環境下,不管不同的執行緒如何使用和排程這個類,這個類總是表現出正確的行為。那麼這個類就是執行緒安全的。
類的執行緒安全有兩個關鍵點:
1.操作的原子性
2.記憶體的可見性。

如果在多個執行緒中共享狀態,當同步機制不正確時,就會出現執行緒不安全的情況。

簡單的程式應該不會有執行緒安全問題吧?

Q:什麼情況下會有執行緒安全問題

A:當某個實現多執行緒的執行緒類中有例項變數時

ps:有狀態,無狀態物件是什麼概念

有狀態就是有資料儲存功能。有狀態物件(Stateful Bean),就是有例項變數的物件?,可以儲存資料,是非執行緒安全的。在不同方法呼叫間不保留任何狀態。

無狀態就是一次操作,不能儲存資料。無狀態物件(Stateless Bean),就是沒有例項變數的物件?.不能儲存資料,是不變類,是執行緒安全的。

為什麼有執行緒安全問題?必須要先了解計算機原理

當多個執行緒同時共享,同一個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。

舉個例子

從記憶體讀取1M資料 250微妙 = 250000納秒
CPU讀取一次記憶體 100納秒

問:從記憶體中讀取1M的int型資料由CPU進行累加,耗時要多久?

答:
1M的資料,Java裡int型為32位,4個位元組
共有1024*1024/4 = 262144個整數
CPU 計算耗時:262144 *0.6 = 157 286 納秒

262144個整數從記憶體讀取到CPU,需要耗時
記憶體讀取耗時:262144*100+250000 = 26 464 400 納秒

怎麼解決執行緒安全問題?

執行緒安全問題,歸根到底一句話:在多執行緒之間修改共享資料引起的

併發程式設計——從入門到成仙

為了讓大家更好的理解學習執行緒併發,在這裡給大家推薦一個由華為資深架構師Mark老師講授的《併發程式設計——從入門到入仙》專題課程!從Java執行緒入門,到原子操作CAS與顯式鎖,再到併發安全,三天快速掌握併發程式設計核心知識,成為併發大神!

你以為這樣就完了?更多併發相關資料,一併奉上!

最後

需要的朋友可以點選:戳這裡免費領取

還有Java核心知識點+全套架構師學習資料和視訊+一線大廠面試寶典+面試簡歷模板可以領取+阿里美團網易騰訊小米愛奇藝快手嗶哩嗶哩面試題+Spring原始碼合集+Java架構實戰電子書+2021年最新大廠面試題。