Как можно сломать этот (не?) потокобезопасный объект?

Ранее я ответил на вопросо безопасности потоков, на который не получил определенного ответа (я думаю ).

Итак, я пытался убедить себя, что дизайн нарушен (видимость) из-за того, что тысячи потоков читают и пишут этот объект, но я не смог получить ничего неожиданного. Это, очевидно, не доказательство того, что это потокобезопасно, возможно, просто доказательство моих собственных ограничений!

Я понимаю риск переупорядочивания, но я не понимаю, как это может применяться в этом случае, в том смысле, что экземпляр 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);
        }
    }
}

7
задан Community 23 May 2017 в 12:31
поделиться