例如,有三個方法 a、b、c,他們的呼叫關係是 a->b->c(a 呼叫 b,b 呼叫 c),在執行時,會構建出下面這樣的呼叫棧。每個方法在呼叫棧裡都有自己的獨立空間,稱為棧幀,每個棧幀裡都有對應方法需要的引數和返回位址。當呼叫方法時,會建立新的棧幀,並壓入呼叫棧;當方法返回時,對應的棧幀就會被自動彈出。也就是說,棧幀和方法是同生共死的。
兩個執行緒可以同時用不同的引數呼叫相同的方法,那呼叫棧和執行緒之間是什麼關係呢?答案是:每個執行緒都有自己獨立的呼叫棧。因為如果不是這樣,那兩個執行緒就互相干擾了。如下面這幅圖所示,執行緒 a、b、c 每個執行緒都有自己獨立的呼叫棧。
那麼問題來了。以下方法是會先執行哪個呢?
set(get()+1);方法的呼叫過程:是將引數先壓入呼叫棧之後,進行引數計算,然後才會執行方法體。
那麼問題又來了。我們平常寫日誌有以下兩種寫法。
寫法a:log.debug("k1"+v1+「,k2」+v2);您覺得哪個好?寫法b:佔位符寫法,log.debug("k1{}",k2{}」,v2);
根據我們剛才的分析。a 寫法雖然不會在控制台列印出,但是呼叫前,已經計算了k1+v1,k2+v2的值。
b這種寫法僅僅是將引數壓棧,而沒有引數的計算。使用{}佔位符是寫日誌的乙個良好習慣。
你get到了嗎?
如果您覺得這篇文章對你有幫助,可以【關注我】或者【點讚】
希望我們一起在架構的路上,像鹿一樣追逐,也想鹿一樣優雅
區域性變數是執行緒安全的,原因是什麼?
摘要 很多小夥伴都知道區域性變數是執行緒安全的,那你知道為什麼區域性變數是執行緒安全的嗎?多個執行緒同時訪問共享變數時,會導致併發問題。那麼,如果將變數放在方法內部,是不是還會存在併發問題呢?如果不存在併發問題,那麼為什麼不會存在併發問題呢?記得上學的時候,我們都會遇到這樣一種題目,列印斐波那契數列...
區域性變數保證執行緒安全
首先來看string這個類的hashcode方法,如下 public inthashcode hash h return h hash是string類的乙個屬性,可以看到這邊首先是 讀取了本地屬性的值,並且賦值給區域性變數h。並且使用h進行了業務邏輯的判斷。如果h沒有值的話,就進行 hash 值的生...
對於區域性變數 什麼是全域性變數和區域性變數?
什麼是全域性變數和區域性變數?有很多朋友經常問我一些關於全域性變數和區域性變數的問題,今天抽點時間給大家簡要闡述下關於全域性變數和區域性變數的一些問題。1 全域性變數 顧名思義,就是對於整個程式都可以使用的變數,任何地方可以使用的變數,當然前提是你必須要定義變數,它定義在函式或子程式的外部,又可以稱...