Java併發編 Java鎖的實現原理

2021-08-20 14:17:54 字數 1718 閱讀 8291

多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...