@Builder
public class X {
@Nonnull String a;
@Nonnull String b;
}
main () {
X.XBuilder builder = X.builder();
//thread 1
CompletableFuture.runAsync(()-> {
builder.a("some");
});
//thread 2
CompletableFuture.runAsync(()-> {
builder.b("thing");
});
}
在這里,同一個物件同時被訪問和修改。那么這段代碼會是執行緒安全的嗎?
用例就像要呼叫多個api,每個api結果是填充類X的欄位。
uj5u.com熱心網友回復:
如果您想知道 Lombok 生成的東西是如何作業的,您可以隨時使用該delombok工具。
關于 的執行緒安全@Builder,您將看到實際上您可以從多個執行緒訪問構建器實體,但僅限于以下約束:
- 不要從不同的執行緒呼叫相同的欄位設定器。否則,您將永遠不知道最終哪個值對構建器有用。
- 確保在呼叫之前所有值設定執行緒都已終止
build()。(如果您也想呼叫build()執行緒,請確保在所有值設定執行緒終止后創建此執行緒。)
這是必要的,因為@Builder不是為并發設計的(因為這不是您通常對構建器所做的事情)。特別是,@Builder不使用同步或volatile欄位,因此您必須為所有 setter 呼叫與build()呼叫創建發生前關系。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504231.html
上一篇:如何打破在標準輸入上監聽的回圈?
