類中的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 裡面講到了道 老子的道,用數學的觀點分析了什麼是道,他說他很有感觸,想發一些感慨,我讀了他的文章後更是想發洩一番。道是什麼,道就是永恆的東西,不變的東西,讓你感到沒有什麼用的東西.道是說不清的東西,既然說不清我就不說了,大哥會飛的魚寫...