為什麼要這樣寫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
- Koala Framework是什麼?我為什麼要寫這個框架?Framework框架
- Scrapy中傳送請求的固定邏輯?為什麼要這樣寫?
- 為什麼要寫《機器學習實踐應用》這本書機器學習
- 為什麼要這樣設計,還是我理解錯誤
- 為什麼 JavaScript 的 this 要這麼用?JavaScript
- 為什麼要虛擬化,為什麼要容器,為什麼要Docker,為什麼要K8S?DockerK8S
- [譯]為什麼要寫 super(props)
- 為什麼要寫技術部落格?
- 為什麼要寫成List a = new ArrayList()
- 為什麼我要寫自己的框架?框架
- 為什麼每個Java的類欄位預設要設為finalJava
- 為什麼if中null要寫在前面?Null
- 我們為什麼要技術寫作
- 為什麼我要編寫自己的UIKitUI
- 為什麼要堅持寫技術博文
- [譯]我們為什麼要寫 super(props)?
- 技術人員為什麼要寫部落格?
- 做為技術人員為什麼要寫部落格?
- 做為技術人員為什麼要寫部落格
- 為什麼要removeREM
- 為什麼要敏捷?敏捷
- 為什麼說小程式開發要趁早?原來隱藏著這樣的秘密!
- 為什麼我要豎向對齊程式程式碼(你也應該這樣做)
- java為什麼要重寫hashCode和equals方法Java
- 刨根問底 : 為什麼, unity 的 Y軸 使用 慣性座標系 旋轉, 原因是什麼,為什麼要這樣設計,理由Unity
- Java重寫equals方法時為什麼要重寫hashcode方法Java
- JAVA為什麼要配置環境變數,怎樣配置Java變數
- 為什麼要code reviewView
- 程式設計師 為什麼要堅持寫部落格程式設計師
- Lock介面、重入鎖ReentrantLock、讀寫鎖ReentrantReadWriteLockReentrantLock
- Node之CommonJS,為什麼模組該這麼寫JS
- 科普:為什麼玩遊戲要開啟這個選項?遊戲
- 為什麼大公司要設定這麼高的門檻?
- 我們為什麼需要 lock 檔案
- 這樣的sql怎麼寫?SQL
- [短文速讀-3] 內部匿名類使用外部變數為什麼要加final變數
- 【高併發】面試官:Java中提供了synchronized,為什麼還要提供Lock呢?面試Javasynchronized