Этот свободный, как класс, не является строго неизменным, потому что поля не являются окончательными, но является ли он потокобезопасным и почему?Безопасность потока свободного класса, использующего clone() и не окончательные поля
Проблема безопасности потока, с которой я связан, - это не состояние гонки, а видимость переменных. Я знаю, что есть обходное решение, использующее конечные переменные и конструктор вместо назначения clone() +. Я просто хочу знать, является ли этот пример жизнеспособной альтернативой.
public class IsItSafe implements Cloneable {
private int foo;
private int bar;
public IsItSafe foo(int foo) {
IsItSafe clone = clone();
clone.foo = foo;
return clone;
}
public IsItSafe bar(int bar) {
IsItSafe clone = clone();
clone.bar = bar;
return clone;
}
public int getFoo() {
return foo;
}
public int getBar() {
return bar;
}
protected IsItSafe clone() {
try {
return (IsItSafe) super.clone();
} catch (CloneNotSupportedException e) {
throw new Error(e);
}
}
}
Вы можете сделать это немного безопаснее, сделав IsItSafe окончательным.Вы беспокоитесь о том, что кто-то меняет foo или bar с отражением? Почему вас беспокоит их видимость? – alpian
Я не беспокоюсь о том, что кто-то модифицирует поле через отражение или расширяет класс. Я спрашиваю, потому что я разработал аналогичный класс, и его безопасность потока была поставлена под сомнение. –
FYI, я разместил продолжение вопроса здесь: http://stackoverflow.com/questions/9633771/how-can-one-break-this-non-thread-safe-object – assylias