У этих методов одинаковый вывод? - PullRequest
2 голосов
/ 17 июня 2010
protected synchronized boolean isTimeoutOccured(Duration timeoutDuration) {
    DateTime now = new DateTime();

    if (timeoutOccured == false) {
        if (new Duration(requestTime.getMillis(), now.getMillis()).compareTo(timeoutDuration) > 0) {
            timeoutOccured = true;
        }
    }

    return timeoutOccured;
}

protected boolean isTimeoutOccured2(Duration timeoutDuration) {

    return atomicTimeOut.compareAndSet(false, new Duration(requestTime.getMillis(), new DateTime().getMillis()).compareTo(timeoutDuration) > 0);

}

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

Да, но атомарные примитивы более эффективны.

1 голос
/ 17 июня 2010

Стоит отметить, что логическое выражение

new Duration(requestTime.getMillis(), new DateTime().getMillis()).compareTo(timeoutDuration) > 0

находится в синхронизированном блоке в вашем первом примере, но вне какого-либо барьера памяти во втором.(Во втором примере результат выражения передается в качестве аргумента в вызов atomic compareAndSet, но оценка самого выражения происходит вне барьера памяти.)

Следовательно, ответ зависит от того, какПотокобезопасны эти другие классы (Duration, DateTime).Я предполагаю, что это классы JodaTime, и быстрый взгляд на javadoc показывает, что эти классы создают поточно-ориентированные и неизменяемые экземпляры, поэтому по этой причине выходные данные всегда должны быть одинаковыми.

Фактически, учитывая, что всесоставные части этого вычисления являются неизменными (все экземпляры DateTime и Duration), вы должны быть в состоянии обойтись без синхронизации или атомарного compareAndSet вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...