AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

字節(jié)面試:說說Java中的鎖機制?

來源: 責編: 時間:2024-05-16 09:08:07 155觀看
導讀Java 中的鎖(Locking)機制主要是為了解決多線程環(huán)境下,對共享資源并發(fā)訪問時的同步和互斥控制,以確保共享資源的安全訪問。鎖的作用主要體現(xiàn)在以下幾個方面:互斥訪問:確保在任何時刻,只有一個線程能夠訪問特定的資源或執(zhí)行特

t5N28資訊網(wǎng)——每日最新資訊28at.com

Java 中的鎖(Locking)機制主要是為了解決多線程環(huán)境下,對共享資源并發(fā)訪問時的同步和互斥控制,以確保共享資源的安全訪問。t5N28資訊網(wǎng)——每日最新資訊28at.com

鎖的作用主要體現(xiàn)在以下幾個方面:t5N28資訊網(wǎng)——每日最新資訊28at.com

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

1.鎖策略

在 Java 中有很多鎖策略,用于對鎖進行分類和指導鎖的(具體)實現(xiàn),這些鎖策略包括以下內(nèi)容:t5N28資訊網(wǎng)——每日最新資訊28at.com

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

2.鎖實現(xiàn)

在 Java 中也有一些具體的鎖實現(xiàn),用于代碼層面的鎖操作以此來保證線程安全的,這些常見的鎖實現(xiàn)有以下幾個:t5N28資訊網(wǎng)——每日最新資訊28at.com

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

(1)synchronized 使用

synchronized 可以用來修飾普通方法、靜態(tài)方法和代碼塊t5N28資訊網(wǎng)——每日最新資訊28at.com

修飾普通方法

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

當 synchronized 修飾普通方法時,被修飾的方法被稱為同步方法,其作用范圍是整個方法,作用的對象是調(diào)用這個方法的對象。t5N28資訊網(wǎng)——每日最新資訊28at.com

修飾靜態(tài)方法

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

當 synchronized 修飾靜態(tài)的方法時,其作用的范圍是整個方法,作用對象是調(diào)用這個類的所有對象。t5N28資訊網(wǎng)——每日最新資訊28at.com

修飾代碼塊

為了減少鎖的粒度,我們可以選擇在一個方法中的某個部分使用 synchronized 來修飾(一段代碼塊),從而實現(xiàn)對一個方法中的部分代碼進行加鎖,實現(xiàn)代碼如下:t5N28資訊網(wǎng)——每日最新資訊28at.com

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

以上代碼在執(zhí)行時,被修飾的代碼塊稱為同步語句塊,其作用范圍是大括號“{}”括起來的代碼塊,作用的對象是調(diào)用這個代碼塊的對象。t5N28資訊網(wǎng)——每日最新資訊28at.com

(2)ReentrantLock 使用

ReentrantLock 基本使用:t5N28資訊網(wǎng)——每日最新資訊28at.com

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

進階使用:嘗試獲取鎖并設定超時時間(可選):t5N28資訊網(wǎng)——每日最新資訊28at.com

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

(3)ReentrantReadWriteLock 使用

ReentrantReadWriteLock 特點如下:t5N28資訊網(wǎng)——每日最新資訊28at.com

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

也就是說:讀讀不互斥、讀寫互斥、寫寫互斥。t5N28資訊網(wǎng)——每日最新資訊28at.com

ReentrantReadWriteLock 基礎使用如下:t5N28資訊網(wǎng)——每日最新資訊28at.com

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

(4)StampedLock 使用

StampedLock 有三種讀寫方法:t5N28資訊網(wǎng)——每日最新資訊28at.com

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

其中 readLock() 和 writeLock() 方法與 ReentrantReadWriteLock 的用法類似,而 tryOptimisticRead() 方法則是 StampedLock 引入的新方法,它用于非常短的讀操作,它是使用如下:t5N28資訊網(wǎng)——每日最新資訊28at.com

// 創(chuàng)建 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); // 釋放寫鎖}

使用樂觀讀鎖的特性可以提高讀操作的并發(fā)性能,適用于讀多寫少的場景。如果樂觀讀鎖獲取后,在讀取共享變量前發(fā)生了寫入操作,則 validate 方法會返回 false,此時需要轉(zhuǎn)換為悲觀讀鎖或?qū)戞i重新訪問共享變量。t5N28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-88356-0.html字節(jié)面試:說說Java中的鎖機制?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 基于Spring Cloud Gateway,實現(xiàn)路由和負載均衡

下一篇: 14個 Python 自動化實戰(zhàn)腳本

標簽:
  • 熱門焦點
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據(jù)博主數(shù)碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 天貓精靈Sound Pro體驗:智能音箱沒有音質(zhì)?來聽聽我的

    這幾年除了手機作為智能生活終端最主要的核心之外,第二個可以成為中心點的產(chǎn)品是什么?——是智能音箱。 手機在執(zhí)行命令的時候有兩種操作方式,手和智能語音助手,而智能音箱只
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數(shù)據(jù),像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新?lián)Q代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 分布式系統(tǒng)中的CAP理論,面試必問,你理解了嘛?

    對于剛剛接觸分布式系統(tǒng)的小伙伴們來說,一提起分布式系統(tǒng),就感覺高大上,深不可測。而且看了很多書和視頻還是一臉懵逼。這篇文章主要使用大白話的方式,帶你理解一下分布式系統(tǒng)
  • 如何通過Python線程池實現(xiàn)異步編程?

    線程池的概念和基本原理線程池是一種并發(fā)處理機制,它可以在程序啟動時創(chuàng)建一組線程,并將它們置于等待任務的狀態(tài)。當任務到達時,線程池中的某個線程會被喚醒并執(zhí)行任務,執(zhí)行完任
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發(fā)某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優(yōu)酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 2納米決戰(zhàn)2025

    集微網(wǎng)報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進制程領先地位的英特爾,甚至初成立不久的新
  • 聯(lián)想的ThinkBook Plus下一版曝光,鍵盤旁邊塞個平板

    ThinkBook Plus 是聯(lián)想的一個特殊筆記本類別,它在封面放入了一塊墨水屏,也給人留下了較為深刻的印象。據(jù)有人爆料,聯(lián)想的下一款 ThinkBook Plus 可能更特殊,它
Top