成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

騰訊音樂:什么鎖比讀寫鎖性能更高?

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

在并發編程中,讀寫鎖 ReentrantReadWriteLock 的性能已經算是比較高的了,因為它將悲觀鎖的粒度分的更細,在它里面有讀鎖和寫鎖,當所有操作為讀操作時,并發線程是可以共享讀鎖同時運行的,這樣就無需排隊執行了,所以執行效率也就更高。

那么問題來了,有沒有比讀寫鎖 ReentrantReadWriteLock 性能更高的鎖呢?

答案是有的,在 Java 中,比 ReentrantReadWriteLock 性能更高的鎖有以下兩種:

  1. 樂觀鎖:樂觀鎖是一種非阻塞鎖機制,它是通過 Compare-And-Swap(CAS)對比并替換來進行數據的更改的,它假設多個線程(或進程)之間很少會發生沖突,因此不會加鎖,只有在需要修改之后,通過對比并替換來修改共享變量的值,因此它在非高并發的環境下的性能是非常高的。
  2. StampedLock:它是 JDK 8 中新增的鎖類型,它提供了三種鎖模式:讀鎖、寫鎖和樂觀讀鎖。相較于 ReentrantReadWriteLock,StampedLock 提供了更細粒度的控制,支持樂觀讀取操作,可以提高并發性能。

1.樂觀鎖

樂觀鎖在 Java 中最常見的實現就是 atomic 家族下的類,例如 AtomicInteger、AtomicLong 等,它的核心方法中使用了 CAS 對比并替換進行變量的修改操作,如下源碼所示:

public final int incrementAndGet() {
    return U.getAndAddInt(this, VALUE, 1) + 1;
}
public final int getAndAddInt(Object o, long offset, int delta) {
    int v;
    do {
        v = getIntVolatile(o, offset);
    } while (!weakCompareAndSetInt(o, offset, v, v + delta)); // CAS 方法
    return v;
}

然而,如果是高并發環境下,那么樂觀鎖可以需要通過多次自旋才能成功修改變量的數據,這種場景下,樂觀鎖的性能可能就不如 ReentrantReadWriteLock 了。

2.StampedLock

StampedLock 有三種讀寫方法:

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

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

因此,我們在加鎖時,可以使用性能更高的讀樂觀鎖來替代傳統的讀鎖,如果能加鎖成功,則它可以和其他線程(即使是寫操作)一起執行,也無需排隊運行(傳統讀鎖遇到寫鎖時需要排隊執行),這樣的話 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中文社群
相關推薦

2024-05-15 09:41:22

樂觀鎖編程

2021-08-20 07:54:20

非公平鎖 Java多線編程

2024-10-10 09:40:29

2024-01-29 01:08:01

悲觀鎖遞歸鎖讀寫鎖

2019-11-28 16:00:06

重入鎖讀寫鎖樂觀鎖

2022-05-07 07:35:44

工具讀寫鎖Java

2021-07-06 08:37:29

Redisson分布式

2020-09-16 07:56:28

多線程讀寫鎖悲觀鎖

2023-03-10 15:45:03

Golang公平鎖

2024-05-15 09:23:45

MySQL排他鎖共享鎖

2024-08-19 00:10:05

RocketMQ應用SDK

2024-06-06 09:03:37

MySQL數據庫共享鎖

2022-02-14 15:07:48

進程FileChanne線程

2023-06-02 08:29:24

https://wwMutex

2014-04-22 09:51:24

LongAdderAtomicLong

2024-03-04 07:37:40

MySQL記錄鎖

2025-02-11 08:39:52

2020-09-26 23:09:00

Linux系統編程讀寫鎖

2023-01-04 13:43:24

讀寫鎖AQS共享模式

2019-01-04 11:18:35

獨享鎖共享鎖非公平鎖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品电影网 | 日韩欧美国产一区二区三区 | 999精品在线观看 | 成人欧美一区二区三区色青冈 | 日本中文字幕在线视频 | 国产欧美日韩综合精品一区二区 | 欧美成人手机视频 | 色性av| 日韩视频在线播放 | 涩涩视频在线观看 | 国产女人与拘做受免费视频 | 中文字幕在线视频网站 | 欧美激情一区二区三区 | 北条麻妃99精品青青久久主播 | 羞羞羞视频 | 亚洲一区中文 | 成人在线视频免费观看 | 情侣av| 亚洲高清在线 | 成人黄在线观看 | jlzzjlzz欧美大全 | 99精品国产一区二区青青牛奶 | 特级毛片爽www免费版 | 中文字幕亚洲欧美 | av在线视 | 日本一区二区高清视频 | 欧美大片一区 | 91秦先生艺校小琴 | 91九色porny首页最多播放 | 黑人精品欧美一区二区蜜桃 | 在线视频91 | 成人免费一级视频 | 久久精品久久久 | 91精品久久久久久久久中文字幕 | 免费观看的黄色网址 | 久久国产精品免费一区二区三区 | 免费一级片 | 天天综合日日夜夜 | 成人免费网视频 | 亚洲欧美中文日韩在线v日本 | 中文字幕成人av |