摘要:奇怪的代碼行這里第一行為什么加了而且還要聲明一個局部變量探尋緣由經過搜索找到的解釋本質上是由于內存模型和之間的不同如果我們直接使用函數內使用的執行時序函數僅會保存的指針會在使用的地方通過指針獲取對象然后再調用相應方法例如好像還可以接受嘛但
奇怪的代碼
JDK 1.8 | java.util.concurrent.locks.ReentrantLock | 125行 /** * Performs non-fair tryLock. tryAcquire is implemented in * subclasses, but both need nonfair try for trylock method. */ final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }
這里第一行 :
final Thread current = Thread.currentThread();
為什么加了final, 而且還要聲明一個局部變量?
探尋緣由經過搜索, 找到的解釋本質上是由于: JVM內存模型 和 OOP 之間的不同.
如果我們直接使用:
Thread current = Thread.currentThread();
函數內使用current的執行時序:
函數僅會保存current的指針
JVM會在使用current的地方, 通過指針獲取Thread對象.
然后再調用相應方法. 例如: current.sleep(1L);
好像還可以接受嘛, 但如果在同一個函數內多次調用呢?
程序會重復 2-3 步驟, 增加代碼的性能開銷.
現在JVM已經可以做到在編譯期, 針對此種類型的代碼調用, 將對象內聯到函數的操作數棧中了.
但在JDK中還是保留了大量的final局部變量的使用, 尤其是在并發包內.
我想, 這就是老一輩工程師, 對代碼的執著, 對性能的追求, 對自己的約束.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77575.html
摘要:當頁面中元素樣式的改變并不影響它在文檔流中的位置時例如等,瀏覽器會將新樣式賦予給元素并重新繪制它,這個過程稱為重繪。 無限期更新前端的一些坑,一些記錄,一些冷知識https://github.com/ssshooter/... 大概從 17 年的六月份開始記錄吧,也已經一年了,其中也包含了一些很簡單的知識,以前還覺得挺難的,現在看起來有點謎之感慨... JavaScript 所有對象...
摘要:關鍵字的字面意思是最終的不可修改的這似乎是一個看見名字就大概能知道怎么用的語法但你是否有深究過在各個場景中的具體使用方法注意事項以及背后涉及的設計思想呢一修飾變量基礎修飾基本數據類型變量和引用數據類型變量相信大家都具備基本的常識被修飾的變量 final關鍵字的字面意思是最終的, 不可修改的. 這似乎是一個看見名字就大概能知道怎么用的語法, 但你是否有深究過final在各個場景中的具體使用方法...
摘要:關鍵字的字面意思是最終的不可修改的這似乎是一個看見名字就大概能知道怎么用的語法但你是否有深究過在各個場景中的具體使用方法注意事項以及背后涉及的設計思想呢一修飾變量基礎修飾基本數據類型變量和引用數據類型變量相信大家都具備基本的常識被修飾的變量 final關鍵字的字面意思是最終的, 不可修改的. 這似乎是一個看見名字就大概能知道怎么用的語法, 但你是否有深究過final在各個場景中的具體使用方法...
摘要:關鍵字的字面意思是最終的不可修改的這似乎是一個看見名字就大概能知道怎么用的語法但你是否有深究過在各個場景中的具體使用方法注意事項以及背后涉及的設計思想呢一修飾變量基礎修飾基本數據類型變量和引用數據類型變量相信大家都具備基本的常識被修飾的變量 final關鍵字的字面意思是最終的, 不可修改的. 這似乎是一個看見名字就大概能知道怎么用的語法, 但你是否有深究過final在各個場景中的具體使用方法...
摘要:語言通過字節碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。有針對不同系統的特定實現,,,目的是使用相同的字節碼,它們都會給出相同的結果。項目主要基于捐贈的源代碼。 本文來自于我的慕課網手記:Java編程中那些再熟悉不過的知識點,轉載請保留鏈接 ;) 1. 面向對象和面向過程的區別 面向過程 優點: 性能比面向對象高。因為類調用時需要實例...
閱讀 2694·2021-11-08 13:16
閱讀 2373·2021-10-18 13:30
閱讀 2241·2021-09-27 13:35
閱讀 1997·2019-08-30 15:55
閱讀 2446·2019-08-30 13:22
閱讀 587·2019-08-30 11:24
閱讀 2083·2019-08-29 12:33
閱讀 1817·2019-08-26 12:10