根據我已閱讀的有關多線程的內容,如果您想創建一個由可變線程不安全類組成的不可變線程安全類,則需要將傳遞給構造函數的可變對象的防禦副本進行更改,以便在其中一些變化之後,您仍將原始版本保留在創建的對象中。例如:防禦性複製是否足以通過可變線程不安全的創建不可變的線程安全類?
import java.util.Date;
public class Person {
private final String name;
private final Date birthDate;
...
public Person(final String name, final Date birthDate, ...) {
this.name = name;
this.birthDate = new Date(birthDate.getTime());
...
}
...
}
是不是有可能爲其他線程修改傳遞給構造函數的出生日期的構造函數被調用後,但由防守副本之前?
如果是,那麼調用構造函數的代碼是否需要確保在構造函數執行時不會修改傳遞的出生日期?
這是否違反了線程安全類的定義之一,即如果一個類在多線程環境中的行爲正確,而客戶端沒有任何額外的同步,則該類表示線程安全?
有沒有其他方法可以確保線程安全?
爲什麼這不是線程安全的?只有一個線程會初始化該對象。 –
您已經指出了確保線程安全的「複製對象」策略的一個限制。在這種情況下,提供所有其他解決方案來確保線程安全的答案太寬了 – ControlAltDel
@AndrewJenkins Date參數不是不可變的 – ControlAltDel