多cpu:一台計算機上多個物理cpu
多核:乙個cpu上多個核心
超執行緒技術:乙個核心多個執行執行單元
高度快取l1、l2、l3:
4核8執行緒:
這樣就存在快取一致性問題。
解決快取一致性問題的方法:匯流排鎖和快取鎖
(1)匯流排鎖
這樣之後i的值都為2,但是我們期待的結果是i = 3。
那麼匯流排鎖的意思是當cpu1拿到變數處理完的時候cpu2處於阻塞狀態,當cpu1處理完之後,cpu2才能進行處理。
匯流排鎖帶來的問題:存在阻塞問題,效能較低。
(2)快取鎖
快取鎖只鎖定快取的資料, 不鎖定匯流排。
cpu1修改完i的值,寫回到記憶體中。此時cpu2嗅探到匯流排上i的值與本地快取中i的值不一致,則快取中i的值失效,cpu2從匯流排鎖上去取i的值,並進行運算。
快取一致性:處理器上提供的快取協議,保證了快取一致性。
快取協議mesi:
m:modify
e:execusive
s:shared
i :invalid
e:execusive狀態:資料在本地快取中,切與記憶體中資料一致;其他的cpu快取中沒有:
s:shared狀態:每個核心的快取都一樣,且與記憶體一致:
m和i狀態:其中乙個核心修改了值,那麼其他的核心的快取失效
volatile:保證共享變數的可見性
向處理器傳送一條lock#使
1、引起處理器快取回寫到記憶體中
2、使其他的處理器快取失效
synchronized:可見性和排他性
可以修飾方法和**塊,支援重入
jdk6之前,是重量級鎖
建立兩個例項就不行了:
全域性鎖:對所有例項都可以
鎖的轉換:
無鎖狀態->偏向鎖->輕量級鎖->重量級鎖
偏向鎖:大部分情況下,多執行緒之間不僅僅不會存在鎖競爭,而且還總是由同乙個執行緒獲得
如果多次訪問的是同乙個執行緒的話,只需要獲取一次鎖
Java多執行緒與併發 Java鎖
累嗎?累就對了,說明你還活著 公平鎖 是指多個執行緒按照申請鎖的順序來獲取鎖,類似排隊打飯,先來後到。非公平鎖 是指多個執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取鎖。在高併發的情況下,有可能會造成優先順序反轉或者飢餓現象 並發包中reentrantlock...
Java併發之讀 寫鎖
讀取 沒有執行緒正在做寫操作且沒有執行緒請求寫操作 寫入 沒有執行緒正在做寫操作 這裡假設寫操作的優先順序比讀操作高 當乙個執行緒已經擁有寫鎖,才允許寫鎖重入 public class readwritelock writerequest writeaccesses writingthread ca...
java併發 重入鎖 ReentrantLock
使用 github主頁 重入鎖,標識在乙個執行緒中,可重複對該資源重複加鎖。針對於aqs實現重入功能 在重寫tryaquires 的時候考慮同乙個執行緒多次lock的情況即可 偽 thread currentthread thread.currentthread getexclusiveownert...