Ранее я ответил на вопросо безопасности потоков, на который не получил определенного ответа (я думаю ).
Итак, я пытался убедить себя, что дизайн нарушен (видимость) из-за того, что тысячи потоков читают и пишут этот объект, но я не смог получить ничего неожиданного. Это, очевидно, не доказательство того, что это потокобезопасно, возможно, просто доказательство моих собственных ограничений!
Я понимаю риск переупорядочивания, но я не понимаю, как это может применяться в этом случае, в том смысле, что экземпляр clone
в методе bar()
является локальным и изменение его полей выполняется до того, как он будет выпущен во внешний мир с помощью return
, после чего экземпляр фактически неизменен. Таким образом, поток, просматривающий возвращенный объект, увидит, что его поле bar
уже имеет правильное значение...
Итак, мой вопрос:какой кодНе могли бы вы показать фрагмент кода, который использует IsItSafe
и который может привести к тому, что 2 потока увидят разные значения поля bar
данного экземпляра IsItSafe
?
Для справки и удобства чтения я копирую код здесь:
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);
}
}
}