Несинхронизированное поведение getter / setter в Java - PullRequest
3 голосов
/ 09 марта 2010

У меня есть класс, который служит делегатом другому.

public class Delegate {

    private AnotherClass ac;

    public void delegateCall() {
        this.ac.actualCall();
    }

    public void setAC(AnotherClass ac) {
        this.ac = ac;
    }
}

Каковы последствия, если у меня много потоков, вызывающих delegateCall(), а другой поток вызывает setAC()? Я предполагаю, что некоторые потоки, вызывающие delegateCall(), получат доступ к экземпляру ac до его установки, а некоторые - к нему после его установки. В моем конкретном приложении не имеет значения, какой экземпляр получает каждый поток.

Мой вопрос: существует ли какая-либо базовая синхронизация, которая может происходить в JVM, что может привести к блокировке потоков, вызывающих DelegateCall ()?

Ответы [ 2 ]

3 голосов
/ 09 марта 2010

Нет, здесь нет ничего, что могло бы заблокировать. Также нет ничего, что могло бы гарантировать, что «читательский» поток когда-либо увидит изменение на ac. В действительности это почти наверняка произойдет, но это не гарантировано (поскольку в коде, который вы здесь показали, нет никаких препятствий, которые могут произойти, это может быть вполне приемлемо для вашей ситуации, конечно.

0 голосов
/ 09 марта 2010

Прочитав описание вашей задачи, я думаю, вам будет интересно предположить, что вы используете Objects Pool.

В вашем коде, как сказал Джон, ничто не мешает вам получить исключение NullPointerException.

...