日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
根據(jù)不同的業(yè)務(wù)場景,選擇合適的鎖?

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

創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今,先為雨湖等服務(wù)建站,雨湖等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為雨湖企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

鎖可以解決什么問題?

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

synchronized

synchronized 是 JDK 提供的內(nèi)置鎖, 由 JVM 虛擬機(jī)內(nèi)部實現(xiàn),是基于 monitor 機(jī)制, 在 JDK 1.6 之后被優(yōu)化,會有一個鎖升級的過程,將鎖的狀態(tài)存儲到對象頭中。

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

四種使用方式

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

加鎖狀態(tài)記錄位置

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

在運行期間,Mark Word里面存儲的數(shù)據(jù)會隨著鎖標(biāo)志位的變化而變化。Mark Word可能變?yōu)榇鎯σ韵?種數(shù)據(jù),如下圖所示

鎖的膨脹和升級

鎖的升級和膨脹時候不可逆轉(zhuǎn)的。

使用場景

JDK 在并發(fā)包中, 使用 synchroinzed 的地方有:

  1. ConcurrentHashMap (jdk 1.8)
  2. HashTable

ReetrantLock

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

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

AQS 隊列結(jié)構(gòu)如下所示,它的本質(zhì)是一個 FIFO 的線程安全的同步隊列,如下圖所示:

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

使用方式

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

 
 
 
 
  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 在并發(fā)包中, 使用 ReetrantLock 的地方有:

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

上面我只是列舉了一部分,對于 ReetrantLock 來看可以說是并發(fā)包中非?;A(chǔ)的類,也是我們學(xué)習(xí)并發(fā)的基礎(chǔ),在后續(xù)的文章中我會給展開做更加深入的分析。

如何選擇鎖?

1.對于單機(jī)環(huán)境我們在 JDK 內(nèi)進(jìn)行并發(fā)控制我們可以使用 synchronized (內(nèi)置鎖) 和 RentrantLock 。

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

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

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

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

參考信息

《深入理解 Java 虛擬機(jī)》周志明

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

 【編輯推薦】

  1. 蘋果推送iOS 15 正式版更新內(nèi)容通知
  2. 庖丁解牛-圖解MySQL 8.0優(yōu)化器查詢解析篇
  3. 緩解SQL注入威脅的三種方法
  4. iPhone 13都快來了 iOS這些硬傷還要忍多久?
  5. 為什么現(xiàn)在的手機(jī)價格越來越貴了?

新聞標(biāo)題:根據(jù)不同的業(yè)務(wù)場景,選擇合適的鎖?
鏈接URL:http://www.5511xx.com/article/dhsishd.html