final關鍵字與不變性

2021-10-17 14:53:49 字數 1059 閱讀 9866

類中的static final屬性則有兩種賦值時機,除了在宣告變數的等號右邊直接賦值,還可以用static初始**塊賦值,而不能用普通的初始化**塊賦值

在方法中的final變數,由於方法中並沒有建構函式,也沒有初始化**塊,所以不規定賦值時機,只要求在變數使用前必須賦值

/**

* 描述: 演示棧封閉的兩種情況,基本變數和物件 先演示執行緒爭搶帶來錯誤結果,然後把變數放到方法內,情況就變了

*/public

class

stackconfinement

implements

runnable

} system.out.

println

("棧內保護的數字是執行緒安全的:"

+ nevergoout);}

@override

public

void

run(

)inthread()

;}public

static

void

main

(string[

] args)

throws interruptedexception }--

----

----

----

----

-------

棧內保護的數字是執行緒安全的:10000

棧內保護的數字是執行緒安全的:10000

13763

public

static

void

main

(string[

] args)

----

----

----

----

true

false

原因:final修飾的 b 在編譯期間就被確定,放入常量池中,因此 c 也就被確定,編譯期間發現常量池中a與c是一樣的,因此 c 直接復用了常量池中的 a。

而 d 在編譯期間不能確定,到執行期間賦值操作會在堆中新建物件,因此a與e位址並不相同

併發安全 final關鍵字和不變性

例子 person物件,age和name都不能再變 不可變的物件,演示其他類無法修改這個物件,public也不行 public class person 具有不變性的物件一定是執行緒安全的,我們不需要對其採取任何額外的安全措施,也能保證執行緒安全 早期 現在final修飾變數 final修飾 3種變...

關於Final關鍵字和不變性的深入理解

人已走 車未動心已動 身未起若有所思 茫然無措 不變性和final的關係?面試題推薦閱讀 jvm類載入 如果物件在被建立後,狀態就不能被修改,那麼它就是不可變的。具有不可變的物件一定是執行緒安全的,我們不需要對其採取任何額外的安全措施,也能保證執行緒安全。類防止被繼承 方法防止被重寫 變數防止被修改...

數學論道 讀《不變性與可變性》

昨天讀了一位大哥的文章 不變性與可變性 2480763.aspx 裡面講到了道 老子的道,用數學的觀點分析了什麼是道,他說他很有感觸,想發一些感慨,我讀了他的文章後更是想發洩一番。道是什麼,道就是永恆的東西,不變的東西,讓你感到沒有什麼用的東西.道是說不清的東西,既然說不清我就不說了,大哥會飛的魚寫...