為什麼CAS加鎖是執行緒安全的? 原子操作底層原理

2022-08-21 08:06:09 字數 375 閱讀 7498

mesi協議中,每個快取的快取控制器不僅知道自己的 讀寫操作,而且也監聽(snoop)其它 cache 的讀寫操作

cpu在讀資料時,如果快取行狀態是i,則需要從記憶體中讀取,並把快取行狀態置為s;如果不是i,則可以直接讀取快取中的值,但在此之前必須要等待對其他cpu的監聽結果,如果其他cpu也有該資料的快取且狀態是m,則需要等待其把快取更新到記憶體後再讀取

cpu可以將狀態為m/e/s的快取寫入記憶體,其中如果快取行狀態為s,則其他cpu快取了相同資料的快取行會無效化

也就是說不會有多個執行緒同時訪問共享變數,而且共享變數更新是對所有執行緒可見的,所以原子操作是執行緒安全的。

HashMap為什麼是執行緒不安全的

hashmap底層是乙個entry陣列,當發生hash衝突的時候,hashmap是採用鍊錶的方式來解決的,在對應的陣列位置存放鍊錶的頭結點。對鍊錶而言,新加入的節點會從頭結點加入。我們來分析一下多執行緒訪問 1.在hashmap做put操作的時候會呼叫下面方法 新增entry。將 key value...

ArrayList為什麼是執行緒不安全的

提到執行緒安全我們應該第一時間想到鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用,所以通過加鎖我們就可以保證乙個執行緒的安全性,list介面下面有兩個實現,乙個是arraylist,另外乙個是vector。從原始碼的角度來看,因為ve...

HashMap為什麼是執行緒不安全的

jdk1.7中hashmap的transfer函式如下 void transfer entry newtable,boolean rehash int i indexfor e.hash,newcapacity e.next newtable i newtable i e e next 此函式tra...