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

獨家報道 lock.lock() 寫在 try 外面?

開發 前端
ReentrantLock 是 JDK 提供的可重入的鎖。提供對 共享資源的獨占訪問,一次只能有一個線程可以獲取該鎖。

[[378852]]

本文轉載自微信公眾號「源碼興趣圈」,作者龍臺。轉載本文請聯系源碼興趣圈公眾號。

前言

面試官:小伙子,JUC 并發包下的可重入鎖 ReentrantLock 在代碼里實際使用過么

混子:用過,ReentrantLock 是 JDK 提供的可重入的鎖。提供對 共享資源的獨占訪問,一次只能有一個線程可以獲取該鎖

面試官:你覺得,ReentrantLock#lock 方法寫到 try 語句外面還是里面

混子:我......

面試官:我們不合適,你走吧

先給出結論,lock.lock() 最規范的寫法是寫到 try 語句的外面

lock.lock()

Oracle 文檔中在介紹鎖的使用時有一段代碼,我們以 ReentrantLock 舉例,代碼如下所示:

  1. ReentrantLock lock = new ReentrantLock(); 
  2. lock.lock(); 
  3. try { 
  4.     // access the resource protected by this lock 
  5. } finally { 
  6.     lock.unlock(); 

Q:為什么要把 lock.unlock() 放到 finally 語句塊?

A:為了保證當前線程執行過程中出現異常時,鎖依然能被釋放掉,避免死鎖的產生

我們來改動一下上面的代碼,看看會產生什么樣的影響

  1. ReentrantLock lock = new ReentrantLock(); 
  2. try { 
  3.     lock.lock(); 
  4.     // access the resource protected by this lock 
  5. } finally { 
  6.     lock.unlock(); 

看著沒問題呀,為啥文章開始不建議這么用?先說下可能會存在的問題

異常堆棧丟失

假設在 lock.lock 方法中加鎖異常(千萬不要杠),那么會進入 finally 語句塊中進行解鎖

繼續跟進,看一下 lock.unlock() 源碼中是如何處理的

lock.lock() 拋出異常有可能還沒獲取到鎖,那么 解鎖源碼中將當前線程比較擁有鎖線程肯定是不相等的,所以會拋出 IMSE (IllegalMonitorStateException)異常

我重寫了 ReentrantLock 加鎖代碼的邏輯,在里面拋出了異常,一起看下會出現什么情況

  1. final void lock() { 
  2.     // 模擬加鎖未成功就拋出異常 
  3.     if (true) { 
  4.         throw new RuntimeException("報錯啦!!!"); 
  5.     } 
  6.     if (compareAndSetState(0, 1)) 
  7.         setExclusiveOwnerThread(Thread.currentThread()); 
  8.     else 
  9.         acquire(1); 

根據下圖可以看出 加鎖時異常堆棧被 "吞掉了",悄無聲息的就沒了。當然這只是舉例,但是誰能保證加鎖未成功時不會拋出異常呢

真實存在的 BUG

上面代碼示例中都是在 try 的第一行寫 lock,出現問題的可能性極低。這里給大家提供一個反面教材,千萬千萬不要有這種類似行為

示例代碼中把 lock 放到了 try 語句塊里,然后 lock 加鎖前面還有可能會產生異常的代碼,這種就涼了,誰用誰涼的那種

結尾

所以關于要不要把 lock.lock() 寫到 try 語句塊里,文章的結論是:

最好是把 lock.lock() 加鎖方法寫到 try 外面,這是一種規范,而不是強制

如果你非要寫到 try 里面,那么 請寫到 try 語句塊的第一行,或者 lock 加鎖方法前面不會存在可能出現異常的代碼

最后,如果你代碼中加鎖放到了 try 語句里,麻煩參考第 1 點

 

責任編輯:武曉燕 來源: 源碼興趣圈
相關推薦

2013-04-19 10:43:47

ChinaHadoop

2011-11-01 12:48:51

2011-10-27 15:28:09

Citrix思杰Synergy

2025-01-16 12:00:00

try-catchfor循環

2009-10-16 14:27:16

甲骨文虛擬化linux

2025-04-24 10:56:01

MySQLInnoDB數據庫鎖

2024-06-12 14:03:31

MySQLInnoDB

2011-08-24 16:41:38

LOCK中文man

2023-07-06 08:06:47

LockCondition公平鎖

2009-08-06 10:35:27

C# lock thi

2011-12-12 19:45:19

IBM

2010-10-14 17:17:07

軟考2010年下半年軟考試題

2017-02-14 10:00:19

Java開發Lock

2021-01-28 23:26:55

MySQL

2024-01-02 14:17:31

MySQLMDL LOCK語句

2010-05-24 10:45:52

子命令Svn lock

2011-11-28 12:55:37

JavaJVM

2009-08-26 15:16:29

C# lock關鍵字

2009-11-16 19:11:29

HPCxeon高性能計算

2009-09-14 16:30:24

虛擬化數據中心云計算
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区三区 | 免费成人在线网站 | 亚洲综合视频 | 二区高清| 日韩免费电影 | 国产乱码精品1区2区3区 | 欧美一级免费观看 | av一级久久 | 韩日三级 | a级在线免费视频 | 国产精品日韩欧美一区二区三区 | 亚洲精品456 | 国产女人与拘做受视频 | 久久亚洲精品国产精品紫薇 | 涩涩视频在线观看免费 | 国产精品黄色 | 久www| 亚洲欧美日韩一区 | 精品国产三级 | 久久涩涩 | 亚洲欧美日韩精品久久亚洲区 | 天天av综合| 尤物在线视频 | 女人av| 日韩国产精品一区二区三区 | 91视频导航 | 久久精品亚洲精品国产欧美 | 国产日韩欧美另类 | 女朋友的闺蜜3韩国三级 | 最新日韩在线 | 亚洲福利片 | 精品一区二区三区免费视频 | 99亚洲视频 | 亚洲精品免费观看 | 国产一区2区 | 成人毛片视频在线播放 | 亚洲天堂日韩精品 | 欧美成人精品 | 亚洲精品免费在线观看 | 亚洲成人精品久久 | 日韩精品欧美精品 |