下面是一個解釋執行緒安全的示例方法:
class Counter {
private int counter = 0;
public void increment() {
counter ;
}
public int getValue() {
return counter;
}
}
為了提供執行緒安全,有幾種方法,我更喜歡使用AtomicInteger方法。然而;
1.我也想知道是否可以通過使用final必要的變數來提供執行緒安全。如果是這樣,我該如何執行此操作?
2.final在 Java 中通常使用變數和方法引數來提供執行緒安全的原因之一是什么?
uj5u.com熱心網友回復:
我只是將這個添加到 Erwan Daniel 的回答中。
如果您想在所有執行緒之間共享一個計數器,這里是您的代碼的另一個版本。
class SharedCounter {
private AtomicInteger sharedCounter ;
public Counter(){
this.sharedCounter = new AtomicInteger(0);
}
public void increment() {
sharedCounter.getAndIncrement();
}
public int value() {
return sharedCounter.get();
}
final 將阻止您atomicInteger12更改它正在使用的物件并且您可以自由設定它的值。
final SharedCounter atomicInteger12 = new Counter() ;
uj5u.com熱心網友回復:
在正確同步的代碼中,不需要final。
例如,如果你會使用:
class MyCounter{
private AtomicInteger c = new AtomicInteger();
public int inc(){return c.incrementAndGet();}
public int get(){return c.get();}
}
并且您將與另一個執行緒共享 MyCounter 實體,您需要確保在寫入 c 和讀取 c 之間存在發生前邊緣。這可以通過多種方式完成,例如將 MyCounter 實體傳遞給某個執行緒的建構式(執行緒啟動規則)。或者您通過 volatile 欄位(volatile 變數規則)或同步塊(監視器鎖定規則)傳遞它。
這通常稱為“安全發布”,對于正確同步的系統,這就是您所需要的。如果您沒有安全地傳遞參考,就會出現資料競爭,并且可能會出現奇怪的問題,例如看到部分構造的物件。因此有第二種機制稱為初始化安全;因此,無論對物件的參考是否未安全發布,使用 final 的初始化安全性都將作為備用解決方案。此 AFAIK 的主要用例是安全性。
所以對于正確同步的代碼,不需要final。
這并不意味著您不應該添加決賽。它有各種各樣的好處,比如沒有意外的變化,而且資訊量很大。所以我更喜歡讓盡可能多的成員欄位成為final。
從記憶體模型的角度來看,Final 對于方法引數沒有任何意義,因為它們是執行緒私有的。在記憶體模型中只需要處理共享記憶體。使方法最終的引數是一個風味問題。有些人想要,有些人不想要。我對長方法簽名并不著迷,除非我正在撰寫一些困難的代碼,否則我傾向于不添加它們。但是,如果默認情況下區域變數和形式引數是最終的(如 Rust),我會很好。
uj5u.com熱心網友回復:
不,final關鍵字與執行緒安全沒有任何共同之處。
final變數上的關鍵字使它們不可變,您不能再更改它們的值。但是,它不像constc 中的關鍵字那樣整個變數內容都不能改變。在 Java 中,只有參考是不可變的。
final AtomicReference<String> toto = new AtomicReference<>("text");
toto.set("new text"); // totally fine
toto = new AtomicReference<>("text"); // does not compile, as toto is immutable reference.
但是,還有另一個關鍵字可以滿足您的需求。是volatile。https://www.baeldung.com/java-volatile
簡而言之,所有執行緒上的值同時更改并且立即可用。這就是所有Atomic*Java 類中使用的內容。
前任。https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.base/share/classes/java/util/concurrent/atomic/AtomicInteger.java
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/407596.html
標籤:
上一篇:多執行緒肯定能提高性能嗎
