高併發場景下ArrayList的執行緒安全問題

2021-09-28 15:00:20 字數 1053 閱讀 3091

arraylist是我們常用的資料結構,在併發場景下是執行緒不安全的。

在讀多寫少的場景下,我們一般會用讀寫鎖 readwritelock來保證共享物件的執行緒安全性。

public object read() 

public void write()

這裡能解決部分問題。但是還是存在當有乙個執行緒在write的時候,其他讀執行緒會被阻塞,假如這時候有大量的讀請求訪問,這時候都會被阻塞,這時候我們怎麼辦?

copyonwrite 思想解決問題

很簡單,顧名思義,利用「copyonwrite」的方式,這個英語翻譯成中文,大概就是「寫資料的時候利用拷貝的副本來執行

這裡最關鍵的就是,在寫執行緒修改完資料後,讀執行緒能訪問到最新資料。

這時候需要配合關鍵字 volatile

// 這個陣列是核心的,因為用volatile修飾了

// 只要把最新的陣列對他賦值,其他執行緒立馬可以看到最新的陣列

private transient volatile object array;

public boolean add(e e)

finally

}

這裡 reentrantlock lock = this.lock;保證只有乙個執行緒對資料進行修改,而更新操作不會影響執行緒的讀。

private e get(object a, intindex)
總結:copyonwritearraylist,就是用空間換時間,更新的時候基於副本更新,避免鎖,然後最後用volatile變數來賦值保證可見性,更新的時候對讀執行緒沒有任何的影響!

在kafka中寫資料,就是利用了copyonwrite的思想。會把訊息先寫入客戶端本地的記憶體緩衝,然後在記憶體緩衝裡形成乙個batch之後再一次性傳送到kafka伺服器上去,這樣有助於提公升吞吐量

高併發場景下的限流策略

目錄快取 降級 限流 漏桶演算法 令牌桶演算法 漏桶演算法與令牌桶演算法的區別 有效提公升熱點資料的訪問效率,在高併發 大流量的場景降低服務端壓力。當訪問量快速增長 服務可能會出現一些問題 響應超時 或者會存在非核心服務影響到核心流程的效能時,仍然需要保證服務的可用性,即便是有損服務。所以意味著我們...

高併發場景下的請求合併

一.在專案中,我們經常用到如下方式進行介面呼叫 有多少請求訪問,就會呼叫多少次第三方介面或資料庫,這樣的情況在高併發場景下很容易出現執行緒被打滿,返回結果慢。為了優化這個介面,後台可以將相同的請求進行合併,然後呼叫批量的查詢介面。請求合併 下面上 已查詢資料庫舉例 1.建立請求類 data buil...

高併發場景下快取處理思路總結

在實際的開發當中,我們經常需要進行磁碟資料的讀取和搜尋,因此經常會有出現從資料庫讀取資料的場景出現。但是當資料訪問量次數增大的時候,過多的磁碟讀取可能會最終成為整個系統的效能瓶頸,甚至是壓垮整個資料庫,導致系統卡死等嚴重問題。常規的應用系統中,我們通常會在需要的時候對資料庫進行查詢,因此系統的大致結...