国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

字節面試:說說Java中的鎖機制?

開發 前端
Java 中的鎖(Locking)機制主要是為了解決多線程環境下,對共享資源并發訪問時的同步和互斥控制,以確保共享資源的安全訪問。

Java 中的鎖(Locking)機制主要是為了解決多線程環境下,對共享資源并發訪問時的同步和互斥控制,以確保共享資源的安全訪問。

鎖的作用主要體現在以下幾個方面:

  • 互斥訪問:確保在任何時刻,只有一個線程能夠訪問特定的資源或執行特定的代碼段。這防止了多個線程同時修改同一資源導致的數據不一致問題。
  • 內存可見性:通過鎖的獲取和釋放,可以確保在鎖保護的代碼塊中對共享變量的修改對其他線程可見。這是因為 Java 內存模型(JMM)規定,對鎖的釋放會把修改過的共享變量從線程的工作內存刷新到主內存中,而獲取鎖時會從主內存中讀取最新的共享變量值。
  • 保證原子性:鎖能夠保證在其保護的代碼塊內,一系列操作是不可分割的整體,即原子操作。這意味著在多線程環境下,這些操作不會被線程調度機制打斷,從而避免了數據的不完整修改。
  • 同步:協調線程間的執行順序,使得某些操作在另一些操作完成之后再執行,保證程序的邏輯正確性。例如,一個線程在寫入數據之后,另一個線程才能讀取該數據,以確保讀取到的數據是最新的。

1.鎖策略

在 Java 中有很多鎖策略,用于對鎖進行分類和指導鎖的(具體)實現,這些鎖策略包括以下內容:

  • 樂觀鎖:它基于一種樂觀的思想,即認為數據一般情況下不會造成沖突,所以不會立即加上鎖,而是在數據進行更新提交的時候再進行檢查。如果發生沖突,則返回錯誤信息,讓用戶決定如何去做。
  • 悲觀鎖:它總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。
  • 自旋鎖:如果持有鎖的線程能在很短時間內釋放鎖,那么那些等待競爭鎖的線程就不需要做內核態和用戶態之間的切換進入阻塞掛起狀態,它們只需要等一等(自旋就是空循環),等持有鎖的線程釋放鎖后即可立即獲取鎖,這樣就避免用戶線程和內核的切換的消耗。
  • 可重入鎖(遞歸鎖):指的是同一個線程外層函數獲得鎖之后,內層遞歸函數仍然能獲得該鎖的代碼。即,線程可以進入任何一個它已經擁有的鎖所同步著的代碼塊。
  • 讀寫鎖:在讀寫場景中,讀操作可以并發進行,但寫操作需要互斥進行。通過讀寫鎖可以實現讀寫分離,提高系統的并發性能。
  • 公平鎖/非公平鎖:公平鎖是指多個線程按照申請鎖的順序來獲取鎖,類似排隊打飯,先到先得。非公平鎖是指多個線程獲取鎖的順序并不是按照申請鎖的順序,有可能后申請的線程比先申請的線程優先獲取鎖。
  • 共享鎖/獨占鎖:共享鎖允許多個線程同時讀取一個資源,而獨占鎖則只允許一個線程訪問資源。
  • 輕量級鎖/重量級鎖:這些是 Java 在 JVM 層面對 synchronized 鎖的優化,以減少線程之間的競爭和提高程序的性能。
  • 分段鎖:將一把鎖分成多段,允許不同的線程同時訪問不同的段,從而提高了并發訪問的性能。
  • 同步鎖:Java 內建的一種同步機制,例如 synchronized,它可以修飾方法或代碼塊,用于保護共享資源的訪問。

2.鎖實現

在 Java 中也有一些具體的鎖實現,用于代碼層面的鎖操作以此來保證線程安全的,這些常見的鎖實現有以下幾個:

  • synchronized:內置鎖(Monitor Lock),可以用于方法或代碼塊,提供互斥訪問。當一個線程進入 synchronized 方法或塊時,它會自動獲取對象的鎖,其他線程則需等待鎖釋放后才能進入。
  • ReentrantLock:是一個重入鎖,是 java.util.concurrent.locks 包中的接口 Lock 的實現,提供了比 synchronized 更靈活的鎖操作,如嘗試獲取鎖、可中斷的獲取鎖、超時獲取鎖等。它也支持公平鎖和非公平鎖策略。
  • ReentrantReadWriteLock(讀寫鎖):也是 java.util.concurrent.locks 包中的一部分,允許同時有多個讀取者,但只允許一個寫入者。它分為讀鎖和寫鎖,讀鎖之間不互斥,讀鎖與寫鎖互斥,寫鎖之間也互斥,適用于讀多寫少的場景。
  • StampedLock(Java 8 引入):提供了三種鎖模式:讀鎖、寫鎖和樂觀讀鎖。相較于 ReentrantReadWriteLock,StampedLock 提供了更細粒度的控制,支持樂觀讀取操作,可以提高并發性能。

(1)synchronized 使用

synchronized 可以用來修飾普通方法、靜態方法和代碼塊

修飾普通方法

public synchronized void method() {
    // .......
}

當 synchronized 修飾普通方法時,被修飾的方法被稱為同步方法,其作用范圍是整個方法,作用的對象是調用這個方法的對象。

修飾靜態方法

public static synchronized void staticMethod() {
    // .......
}

當 synchronized 修飾靜態的方法時,其作用的范圍是整個方法,作用對象是調用這個類的所有對象。

修飾代碼塊

為了減少鎖的粒度,我們可以選擇在一個方法中的某個部分使用 synchronized 來修飾(一段代碼塊),從而實現對一個方法中的部分代碼進行加鎖,實現代碼如下:

public void classMethod() throws InterruptedException {
    // 前置代碼...
    
    // 加鎖代碼
    synchronized (SynchronizedExample.class) {
        // ......
    }
    
    // 后置代碼...
}

以上代碼在執行時,被修飾的代碼塊稱為同步語句塊,其作用范圍是大括號“{}”括起來的代碼塊,作用的對象是調用這個代碼塊的對象。

(2)ReentrantLock 使用

ReentrantLock 基本使用:

// 1. 創建ReentrantLock對象
ReentrantLock lock = new ReentrantLock();
// 2.獲取鎖
lock.lock(); 
try {
    // 3.得到鎖,執行需要同步的代碼塊
} finally {
    // 4.釋放鎖
    lock.unlock(); 
}

進階使用:嘗試獲取鎖并設定超時時間(可選):

ReentrantLock lock = new ReentrantLock();
 // 嘗試獲取鎖,等待2秒,超時返回false
boolean locked = lock.tryLock(2, TimeUnit.SECONDS);
if (locked) {
    try {
        // 執行需要同步的代碼塊
    } finally {
        lock.unlock();
    }
}

(3)ReentrantReadWriteLock 使用

ReentrantReadWriteLock 特點如下:

  • 多個線程可以同時獲取讀鎖,實現讀共享的并發訪問。
  • 寫鎖是排它的,一旦有一個線程獲取寫鎖,其他線程無法獲取讀鎖或寫鎖,直到寫鎖釋放。
  • 讀鎖與讀鎖之間可以共存,但寫鎖與讀鎖和寫鎖之間是互斥的。

也就是說:讀讀不互斥、讀寫互斥、寫寫互斥。

ReentrantReadWriteLock 基礎使用如下:

// 創建 ReentrantReadWriteLock 對象
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
// 創建讀鎖
ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
// 獲取讀鎖
readLock.lock(); 
try {
    // 讀取共享資源的操作
} finally {
    // 釋放讀鎖
    readLock.unlock(); 
}
// 創建寫鎖
ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
// 獲取寫鎖
writeLock.lock();
try {
    // 寫入共享資源的操作
} finally {
    // 釋放寫鎖
    writeLock.unlock(); 
}

(4)StampedLock 使用

StampedLock 有三種讀寫方法:

  • readLock():讀鎖,用于多線程并發讀取共享資源。
  • writeLock():寫鎖,用于獨占寫入共享資源。
  • tryOptimisticRead():讀樂觀鎖,用于在不阻塞其他線程的情況下嘗試讀取共享資源。

其中 readLock() 和 writeLock() 方法與 ReentrantReadWriteLock 的用法類似,而 tryOptimisticRead() 方法則是 StampedLock 引入的新方法,它用于非常短的讀操作,它是使用如下:

// 創建 StampedLock 實例
StampedLock lock = new StampedLock();
// 獲取樂觀讀鎖
long stamp = lock.tryOptimisticRead(); 
// 讀取共享變量
if (!lock.validate(stamp)) { // 檢查樂觀讀鎖是否有效
    stamp = lock.readLock(); // 如果樂觀讀鎖無效,則獲取悲觀讀鎖
    try {
        // 重新讀取共享變量
    } finally {
        lock.unlockRead(stamp); // 釋放悲觀讀鎖
    }
}

// 獲取悲觀讀鎖
long stamp = lock.readLock(); 
try {
    // 讀取共享變量
} finally {
    lock.unlockRead(stamp); // 釋放悲觀讀鎖
}

// 獲取寫鎖
long stamp = lock.writeLock(); 
try {
    // 寫入共享變量
} finally {
    lock.unlockWrite(stamp); // 釋放寫鎖
}

使用樂觀讀鎖的特性可以提高讀操作的并發性能,適用于讀多寫少的場景。如果樂觀讀鎖獲取后,在讀取共享變量前發生了寫入操作,則 validate 方法會返回 false,此時需要轉換為悲觀讀鎖或寫鎖重新訪問共享變量。

責任編輯:姜華 來源: Java中文社群
相關推薦

2021-06-29 09:47:34

ReactSetState機制

2020-12-14 11:35:22

SPI Java機制

2024-06-24 00:09:00

零拷貝技術MMapsendFile

2024-08-12 17:36:54

2021-06-30 07:19:36

React事件機制

2021-06-10 07:51:07

Node.js循環機制

2020-09-16 07:56:28

多線程讀寫鎖悲觀鎖

2022-08-17 08:17:01

SPI機制接口

2025-10-31 02:00:00

2024-03-18 12:21:28

Java輕量級鎖重量級鎖

2019-05-10 10:50:04

Spring AOPJDK動態代理CGLIB動態代理

2020-07-19 10:26:47

Kubernetes數據結構

2024-03-28 10:37:44

IoC依賴注入依賴查找

2021-04-29 11:18:14

JVM加載機制

2020-12-01 08:47:36

Java異常開發

2019-10-17 08:51:00

Java悲觀鎖Monitor

2020-04-24 15:44:50

MySQL數據庫鎖機制

2023-10-31 10:51:56

MySQLMVCC并發性

2024-11-19 15:13:02

2025-04-08 00:00:00

@AsyncSpring異步
點贊
收藏

51CTO技術棧公眾號

99精品视频一区| 日本不卡一二三区黄网| 精品在线视频一区二区| 日韩69视频在线观看| 清纯唯美日韩制服另类| 日韩欧美国产二区| 狠狠操在线视频| 五月天亚洲综合情| 日韩一区免费观看| 国产精美视频| 成人免费一区| 国产日韩专区| 波多野结衣中文一区| 香蕉乱码成人久久天堂爱免费| 一区二区三区国产在线观看| 日韩电影中文字幕在线观看| **欧美日韩vr在线| 996这里只有精品| 在线免费91| 日本a级不卡| 狠狠色狠狠色合久久伊人| 91亚洲精华国产精华精华液| 日韩欧国产精品一区综合无码| 日韩高清一区在线| 免费的av在线| 一区二区三区在线观看网站| 色综合久综合久久综合久鬼88 | 不卡av一区二区| 大色综合视频网站在线播放| 国产精品一区二区三区av麻| 国产成人极品视频| 狠狠操第一页| 91精品啪在线观看国产18| 亚洲在线一区二区| 日本一区二区免费高清| 91系列在线观看| 6080成人| 欧美乱大交xxxxx另类电影| 久久悠悠精品综合网| 国产精品免费一区| 欧美天天视频| 一本色道久久综合亚洲二区三区| 国产精品久久久久蜜臀 | 精品视频自拍| 日本大胆欧美人术艺术动态| 91精品国产综合久久精品图片 | 精品国产三级| 国产精品久久精品国产| 国产精品17p| 久久综合九色综合欧美就去吻 | 成人观看网站a| 欧美激情久久久久久久久久久| 91福利国产成人精品照片| 少妇高清精品毛片在线视频| 国产一区二区三区免费| 久久精品午夜一区二区福利| 午夜精品毛片| 精品视频第一区| 亚洲精品在线二区| 免费观看成人高| 精品一区免费av| 国产成人艳妇aa视频在线| 日本不卡免费在线视频| 日本一区视频在线观看| 裸体一区二区三区| 黄色免费观看视频网站| 中文字幕中文在线不卡住| 成人动漫av| 91精品国产乱码| 日韩视频网站在线观看| 久久在线精品视频| 三级电影一区| 黑人另类av| 成人黄色网址在线观看| 国产乱真实合集| 日韩欧美123| 免费看久久久| 91香蕉国产在线观看| 美女视频一区二区| 免费成人看片| 精品无人区乱码1区2区3区在线| 麻豆一区在线| 手机看片福利永久国产日韩| 高清久久久久久| 91精品久久久久久9s密挑| 日韩欧美国产wwwww| 91国产一区| 国产尤物99| 国产精品成人免费精品自在线观看 | 444亚洲人体| 91在线视频播放| 日本在线视频观看| 国产精品免费观看在线| 国产成人亚洲综合色影视| 粉嫩av在线播放| 欧美最猛性xxxxx(亚洲精品)| 亚洲卡通动漫在线| 青青草成人影院| 9l视频自拍9l视频自拍| 性久久久久久久久久久久| 色狠狠一区二区三区| 天堂√在线观看一区二区| 亚洲色图欧美激情| 欧美视频二区欧美影视| 99亚洲精品视频| 91精品国产综合久久久蜜臀粉嫩| 精品国产一区二区三区小蝌蚪 | 日韩av二区在线播放| 黑料吃瓜在线观看| 麻豆国产欧美日韩综合精品二区 | 鲁鲁在线中文| 日韩精品999| 天天干天天综合| 久久99精品久久久久久噜噜| 国产一区二区不卡老阿姨| cao在线视频| 久久久久久久久一区二区| 欧美日韩大陆一区二区| 久久中文视频| 你懂的在线播放| 欧美日韩亚洲免费| 亚洲国产天堂久久综合网| 懂色av一区二区在线播放| 成人国产精品一区二区免费麻豆| 亚洲春色在线视频| 在线播放日韩精品| 成人爱爱电影网址| 北条麻妃在线一区二区免费播放| 午夜免费福利在线| 国产欧美日韩精品专区| 欧美精品一卡两卡| 亚洲free嫩bbb| 精品裸体舞一区二区三区| 久久在线精品| 精品伊人久久| 国产中文在线| 免费拍拍拍网站| 国产日韩中文在线| 69堂亚洲精品首页| 2022国产精品视频| 国产精品入口久久| 九色porny自拍视频在线观看| 午夜久久久精品| 欧美最大成人综合网| 久久久久www| 精品噜噜噜噜久久久久久久久试看| 久久久91精品国产一区二区精品| 韩国亚洲精品| 精品久久ai电影| 国产在线看片免费视频在线观看| 国产专区中文字幕| 亚洲在线欧美| 91青青草免费观看| 国产精品一区=区| 欧美精品videos另类日本| 在线电影一区二区三区| 亚洲欧洲综合另类| 精品一区二区在线播放| 伊人成年综合电影网| 久久综合国产| 日韩极品在线| 日韩精品导航| 一区二区三区视频播放| 久久免费影院| 成人精品动漫| 粉嫩一区二区| 毛片电影在线| 成人国产精品入口免费视频| 欧美人与动牲性行为| 国产在线日本| caoporn免费在线| 成人影音在线| 朝桐光一区二区| 国产极品嫩模在线观看91精品| 蜜桃视频m3u8在线观看| 污视频在线看操| 国产日本在线观看| 成人片在线看| 久久uomeier| 成人精品电影在线| 97色婷婷成人综合在线观看| 九九久久国产| 美女精品久久| 久久国产电影| 亚洲一区黄色| 成人午夜视频福利| 亚洲麻豆国产自偷在线| 亚洲国产精品久久人人爱蜜臀| 亚洲影视资源网| 精品女厕一区二区三区| 欧美日韩大陆一区二区| 亚洲成人在线网| 这里只有精品丝袜| 欧美福利视频在线观看| 国产精品日韩在线| 国产日韩欧美大片| 羞羞的视频免费| 成人av电影观看| a√中文在线观看| 国产一区二区在线|