簡體   English   中英

java中的最終變量和同步塊

[英]Final variable and synchronized block in java

Java中的最終變量是什么? 例如:如果我寫final int temp; 在函數中final關鍵字的含義是什么?
另外,我什么時候想使用final變量(作為類變量和函數變量)?
為什么同步塊中的變量必須聲明為final?

基本上它只是意味着你無法改變價值。 對於實例變量,您必須在構造函數中(或使用變量初始化程序)分配一次(並且僅一次)任何最終變量。 同步是一個非常正交的概念。

使局部變量最終的主要原因是你可以在匿名內部類中使用它...這與在同步塊中無關。

最后的變量不變類是有用的,無可否認的-和永恆讓生活在多線程環境中更容易-但是這兩個是我能想到的之間的唯一關系...

編輯:Wildwezyr的評論在不改變您正在同步的變量方面是有意義的。 由於他給出的原因,這將是危險的。 這就是“同步塊中的變量”的含義嗎?

最終變量和同步代碼塊確實有一些共同之處...如果你聲明非最終變量a然后寫synchronized (a) { System.out.println('xxx'); } synchronized (a) { System.out.println('xxx'); }你會得到警告“同步於非最終場” -至少在NetBeans。

為什么你不應該在非最終領域同步? 因為如果字段值可能改變,則不同的線程可能在不同的對象上同步(字段的不同值) - 因此根本不存在同步(每個線程可以同時進入同步塊)。

在這里查看通過在非最終字段上同步導致的現實問題的示例: http//forums.sun.com/thread.jspa?threadID = 5379204

除了Jon Skeet所說的,價值不能改變,但內容可能會改變。

final Integer one = new Integer(1);
...
one = new Integer(2); // compile error

final List list = new ArrayList();
...
list = new ArrayList(); // compile error
list.add(1); // Changes list, but that's fine!

還要注意最終和靜態決賽是不一樣的。 final在實例的范圍內,而static final對於類的所有實例都是相同的(在其他語言中,這可以稱為常量)。

我個人認為final的優勢,即使不是絕對需要讓你的軟件正常工作,也具有語義意義。 它使您可以向編譯器和處理該代碼的下一個人說這個變量不應該被更改,並且嘗試更改它可能會導致錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM