В соответствии с тем, что я прочитал о многопоточности, если вы хотите создать безопасный класс потоков, состоящий из небезопасных классов с изменяемыми потоками, вам нужно сделать защитные копии измененных объектов, переданных конструктору, чтобы, если некоторые из них изменяются впоследствии вы сохраняете исходную версию в созданном объекте. Пример:Оборонительное копирование достаточно, чтобы создать неизменяемые потокобезопасные классы из изменчивых потоков, небезопасных?
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
@ Параметр DateAndrewJenkins не является неизменным. – ControlAltDel