續 高併發存在的問題?

2021-09-24 11:09:19 字數 562 閱讀 9949

執行緒安全問題的根源?

可見性(主要是快取引起的,由於cpu快取 記憶體 io磁碟 )

有序性(指令重排可能引起的執行緒安全)

其實可見性和有序性是分不開的程式的執行cpu可能會打亂指令優化執行順序,但是這樣會導致cpu中的資料可能會亂掉

class volatileexample

public void reader()

}

快取中x = 0 ,42, flag  = true  、false時x可能存在兩種值所以此時禁用快取 (volatile boolean flag = false;)

其實更像是強制改變了flag = true 執行一定在x =42 之後

即將flag =true 寫入到記憶體中就行了 ,去記憶體中讀取 時flag = true時 x = 42值已經確定可以讀到

原子性(cpu的執行不可被中斷,意思是多執行緒訪問時會由於執行緒切換存在問題)

原子性問題主要是發生在多執行緒情況下,資料的競爭引起的有乙個變數count多個執行緒同時訪問在count++

時發生執行緒切換可能會導致資料的不一致現象

Redis在高併發下存在的問題

描述 在某些特定環境下,無論是先更新redis還是更新資料庫,兩者的資料都有可能不一致。解決方案1 雙寫模式 解決方案2 失效模式 最終解決方案 無論是雙寫模式還是失效模式,都會導致快取的不一致問題。即多個例項同時更新會出事,怎麼辦?如果是使用者緯度資料 訂單資料 使用者資料 這種併發機率非常小,不...

快取在高併發場景下的常見問題

當資料時效性要求很高時,需要保證快取中的資料與資料庫中的保持一致,而且需要保證快取節點和副本中的資料也保持一致,不能出現差異現象。這就比較依賴快取的過期和更新策略。一般會在資料發生更改的時,主動更新快取中的資料或者移除對應的快取。快取過期後將嘗試從後端資料庫獲取資料,這是乙個看似合理的流程。但是,在...

快取在高併發場景下的常見問題

當資料時效性要求很高時,需要保證快取中的資料與資料庫中的保持一致,而且需要保證快取節點和副本中的資料也保持一致,不能出現差異現象。這就比較依賴快取的過期和更新策略。一般會在資料發生更改的時,主動更新快取中的資料或者移除對應的快取。快取過期後將嘗試從後端資料庫獲取資料,這是乙個看似合理的流程。但是,在...