為什麼要這樣寫final ReentrantLock lock = this.lock; ?
今天JVMPocket天方夜譚群裡的一個朋友問了個問題,為什麼CyclicBarrier的程式碼要這樣寫:
final ReentrantLock lock = this.lock;
lock.lock;
其實如果閱讀過java.util.concurrent包下原始碼的童鞋會發現,不止CyclicBarrier原始碼是這樣做的,這個包下,所有以final修飾的成員變數讀取的程式碼大部分情況都是這樣寫的,大部分指情況的是:
- 全部的迴圈程式碼塊裡(while、for)讀取這些final的成員變數的時候;
- 部分或全部的非迴圈程式碼塊裡讀取這些final的成員變數的時候;
為什麼要這樣做呢?
原因一、為了加快訪問速度;
將全域性變數賦值給方法的一個區域性變數,訪問的時候直接線上程棧裡面取,比訪問成員變數速度要快,讀取棧裡面的變數只需要一條指令,讀取成員變數則需要兩條指令;
原因二、為了安全;
如果只是為了訪問速度快,那麼直接使用一個普通的區域性變數即可,不需要加final,加了final原因就是為了多執行緒下的執行緒安全。
final的作用,一經初始化就無法被更改,並且保證物件訪問的記憶體重排序,保證物件的可見性,更詳細內容見這裡
ps: 需要注意的是,當final變數為物件或者陣列時:- 雖然我們不能講這個變數賦值為其他物件或者陣列,但是我們可以改變物件的域或者陣列中的元素。
- 執行緒對這個物件變數的域或者資料的元素的改變不具有執行緒可見性。
相關文章
- Nginx代理websocket為什麼要這樣做?NginxWeb
- Scrapy中傳送請求的固定邏輯?為什麼要這樣寫?
- 寫出幾個初始化CSS的樣式,並解釋說明為什麼要這樣寫CSS
- 為什麼要寫作
- Lock介面、重入鎖ReentrantLock、讀寫鎖ReentrantReadWriteLockReentrantLock
- 為什麼要寫這一系列的部落格
- [譯]為什麼要寫 super(props)
- 為什麼 JavaScript 的 this 要這麼用?JavaScript
- 為什麼要虛擬化,為什麼要容器,為什麼要Docker,為什麼要K8S?DockerK8S
- 為什麼要寫《怎樣解題:數學競賽攻關寶典》?
- 我們為什麼要技術寫作
- 為什麼if中null要寫在前面?Null
- [譯]我們為什麼要寫 super(props)?
- 精讀:為什麼我們要寫super(props)
- java為什麼要重寫hashCode和equals方法Java
- 為什麼要堅持寫技術博文
- 為什麼說小程式開發要趁早?原來隱藏著這樣的秘密!
- [短文速讀-3] 內部匿名類使用外部變數為什麼要加final變數
- 我們為什麼需要 lock 檔案
- 刨根問底 : 為什麼, unity 的 Y軸 使用 慣性座標系 旋轉, 原因是什麼,為什麼要這樣設計,理由Unity
- Node之CommonJS,為什麼模組該這麼寫JS
- 程式設計師 為什麼要堅持寫部落格程式設計師
- 【高併發】面試官:Java中提供了synchronized,為什麼還要提供Lock呢?面試Javasynchronized
- 為什麼要code reviewView
- 併發Lock之ReentrantLock實現原理ReentrantLock
- 為什麼大公司要設定這麼高的門檻?
- [20220216]為什麼出現這樣的情況.txt
- Python是什麼?為什麼要掌握python?Python
- 為什麼 Python 程式碼要寫得美觀而明確Python
- 為什麼Java有了synchronized之後還造了Lock鎖這個輪子?Javasynchronized
- FTP這麼“好用”和“便宜”,為什麼企業還要替換掉?FTP
- 為什麼那麼多人要學Java?這三個原因告訴你Java
- 科普:為什麼玩遊戲要開啟這個選項?遊戲
- 為什麼要學習Netty?Netty
- 為什麼要學習 RustRust
- 為什麼要學習 Julia
- 為什麼要指令重排序?排序
- 為什麼要財務自由