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

根據不同的業務場景,選擇合適的鎖?

開發
鎖可以解決并行執行任務執行過程中對,共享數據順序訪問、修改的場景。比如對同一個賬戶進行并行扣款或者轉賬。下面我們展開討論下 synchronized 、ReetranLock 以及他們的使用。

前言:剛開始我看到這個標題的時候我感覺“很熟悉,但是又很陌生”,因為鎖是有效的解決并發情況下保證臨界資源操作原子性的有效手段之一。下面我就從我們幾個開發使用的角度來說我們常用的鎖。

鎖可以解決什么問題?

鎖可以解決并行執行任務執行過程中對,共享數據順序訪問、修改的場景。比如對同一個賬戶進行并行扣款或者轉賬。下面我們展開討論下 synchronized 、ReetranLock 以及他們的使用。

synchronized

synchronized 是 JDK 提供的內置鎖, 由 JVM 虛擬機內部實現,是基于 monitor 機制, 在 JDK 1.6 之后被優化,會有一個鎖升級的過程,將鎖的狀態存儲到對象頭中。

鎖升級過程,默認是無鎖狀態,首先會進行判斷,如果是沒有字段競爭的情況下會使用偏向鎖,偏向鎖的本質就是將當前獲得鎖的線程 id 設置到共享數據的對象頭中。然后升級為輕量級鎖,輕量級鎖的本質是通過 CAS 來修改 MarkWord 來實現的。最后再升級為重量級鎖,我們可以通過操作系統的 monitor 依賴操作系統的 MutexLock(互斥鎖)來實現的 。

四種使用方式

  1. 在靜態方法上使用
  2. 在普通方法上使用
  3. 鎖定 this 狀態
  4. 鎖定靜態類

加鎖狀態記錄位置

對象加鎖,記錄在對象頭中,對象頭如下圖所示。

在運行期間,Mark Word里面存儲的數據會隨著鎖標志位的變化而變化。Mark Word可能變為存儲以下4種數據,如下圖所示

鎖的膨脹和升級

鎖的升級和膨脹時候不可逆轉的。

使用場景

JDK 在并發包中, 使用 synchroinzed 的地方有:

  1. ConcurrentHashMap (jdk 1.8)
  2. HashTable

ReetrantLock

ReetrantLock 開發作者是 Doug Lea ,從 JDK1.5 開始過后加入 JDK 的鎖,主要是通過 QAS 的方式來實現的, 通過 Unsafe 包提供的 CAS 操作來進行鎖狀態(state)的競爭。然后通過 LockSupport.park(this). 進行 park 住線程,如果在 AQS 隊列頭的對象進行喚醒執行 unpack 方法,然后讓他去競爭鎖。

ReetrantLock 還分為公平鎖和非公平鎖,默認是非公平鎖。因為公平鎖,是需要保證競爭者按照獲取鎖的順序進行獲得,性能略低于非公平鎖。

AQS 隊列結構如下所示,它的本質是一個 FIFO 的線程安全的同步隊列,如下圖所示:

ReetrantLock 加鎖和解鎖的過程如下圖所示:

使用方式

ReetrantLock 的使用方式如下,主要是有三個步驟:創建、加鎖、解鎖。

  1. class X { 
  2.   private final ReentrantLock lock = new ReentrantLock(); 
  3.   // ... 
  4.  
  5.   public void m() { 
  6.     lock.lock();  // block until condition holds 
  7.     try { 
  8.       // ... method body 
  9.     } finally { 
  10.       lock.unlock() 
  11.     } 
  12.   } 

使用場景

JDK 在并發包中, 使用 ReetrantLock 的地方有:

  1. CyclicBarrier
  2. DelayQueue
  3. LinkedBlockingDeque
  4. ThreadPoolExecutor
  5. ReentrantReadWriteLock
  6. StampedLock

上面我只是列舉了一部分,對于 ReetrantLock 來看可以說是并發包中非常基礎的類,也是我們學習并發的基礎,在后續的文章中我會給展開做更加深入的分析。

如何選擇鎖?

1.對于單機環境我們在 JDK 內進行并發控制我們可以使用 synchronized (內置鎖) 和 RentrantLock 。

2.對于自增或者原子數據累計我們可以使用 Unsafe 提供的原子類,比如 AtomicInteger , AtomicLong

3.對于數據庫的話,對于用戶金額扣除的場景我們可以使用樂觀鎖的方式來進行控制,SQL 如下

  1. update table_name set amount = 100,  
  2.                       version = version + 1 where id = 1 and version = 1; 

4.對于分布式場景下我們需要保證一致性,可以使用 Redis 或者 Zk 實現分布式鎖。來進行分布式場景下的并發控制。

參考信息

《深入理解 Java 虛擬機》周志明

https://blog.csdn.net/wangbo199308/article/details/108688109

 【編輯推薦】

 

責任編輯:姜華 來源: 運維開發故事
相關推薦

2022-04-01 11:26:19

緩存數據庫讀寫策略

2023-09-13 11:54:50

DockerKubernetes微服務

2023-07-03 06:49:05

CMS預算資金

2021-07-01 10:54:42

云計算供應商云應用

2023-05-09 16:25:57

Azure 存儲文件存儲

2025-06-18 10:55:35

2019-03-11 15:48:13

企業存儲數據

2010-08-20 13:47:11

BlackBerry應BlackBerry

2018-02-28 15:19:43

云計算云計算顧問咨詢

2009-02-02 09:31:25

MySQL存儲引擎MyISAM

2022-03-17 17:08:05

機器學習算法類型

2013-08-07 14:04:22

MySQL備份

2017-09-12 08:22:59

DCIM軟件數據中心

2024-07-25 09:01:22

2009-08-11 09:24:26

選擇敏捷方法敏捷

2011-11-04 17:35:52

2021-06-23 09:00:00

人工智能機器學習技術

2020-05-26 18:35:00

機器學習人工智能AI

2013-09-11 19:07:27

IT安全框架信息安全COBIT
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级视频 | 黄色国产| 男女爱爱福利视频 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 成人日韩精品 | 欧美日韩国产一区二区 | 国产区高清 | 成人免费福利 | 国产精品免费在线 | 91色在线 | 美女视频h | 国产高清精品在线 | 91精品国产一区二区在线观看 | 日本在线网址 | 一区二区三区国产精品 | 国产精品一级 | 精品九九| 不卡av电影在线播放 | 中文字幕视频在线看5 | 天天射影院 | 99色视频| 成人欧美一区二区三区白人 | 欧美日韩亚洲在线 | 亚洲精视频| 亚洲三级视频 | 中文字幕乱码一区二区三区 | av中文字幕网 | 亚洲精品久久久久久一区二区 | 日本视频一区二区 | 喷水毛片 | 妹子干综合 | 亚洲人va欧美va人人爽 | 97精品超碰一区二区三区 | 在线看一区二区三区 | 亚洲国产小视频 | 国产精品成人在线播放 | 97高清国语自产拍 | 91麻豆精品国产91久久久久久久久 | 久热久 | 欧美精品在线观看 | 精品在线观看入口 |