2 потока, выполняющие myAtomicReference.compareAndSet (ожидается, новая дата ()) - PullRequest
3 голосов
/ 12 ноября 2010
static boolean unsynchronizedSetter(Date expected){
    Date newDate = new Date();
    AtomicReference<Date> myAtomicReference = Lookup.getAtomicRef();
    boolean myStatus = myAtomicReference.compareAndSet(expected, newDate); //CAS
    return myStatus;
}

В: Если 2 потока его выполнят, какой объект будет сохранен в атомарной ссылке?

В многопроцессорной машине 2 потока могут выполнять CAS в одном такте.Предположим, что они оба используют один и тот же объект myAtomicReference для выполнения CAS, оба используют правильное значение «ожидаемый», но они пытаются вставить 2 разных объекта, т.е. 2 newDate.Один из них должен завершиться с ошибкой, но будет ли myStatus иметь значение false в этом потоке?

Я полагаю, что одна аппаратная реализация CompareAndSwap заставит потоки стоять в очереди для выполнения своих обновлений.Я предполагаю, что даже если 2 процессора выполняют инструкцию CAS в одном и том же тактовом цикле, один из них, вероятно, задерживается.

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Спасибо за ввод. Как оригинальный вопросник, теперь я чувствую, что myStatus == true в обеих темах - это мой предварительный ответ на мой собственный вопрос ниже

"One of them must fail, but will myStatus be false in that thread?"

Возможно, ИМХО, что оба потока "думают", что им удалось вставить свой соответствующий newDate объект. Однако первый поток должен знать, что его переменная myStatus безнадежно ненадежна все время, сразу после операции CAS. Это ненадежно, потому что myStatus может быть истинным, но когда вы читаете AtomicReference, значение в нем может измениться. Общий AtomicReference может быть изменен в любое время любым потоком. Этот экземпляр AtomicReference не защищен никакой конструкцией синхронизации.

myStatus==true только означает, что этот поток имел правильное предположение о значении expected, поэтому JVM должна дать ему обещанный приз за правильное предположение. Однако JVM не будет хранить newDate внутри AtomicReference. Так что выиграть этот «приз» ничего не значит.

Надеюсь, в этом есть какой-то смысл.

1 голос
/ 29 марта 2011
Q: If 2 threads executes it, which object will get stored in the atomic reference?

Никто не может знать.Согласно javadoc , одному из них.

In a multi-processor machine, 2 threads could be performing the CAS in the same clock cycle.

AFAIK, глобальных часов для текущих многоядерных процессоров Intel / AMD не существует.

One of them must fail, but will myStatus be false in that thread?

Это должно бытьиначе это означало бы, что это удалось, и весь java.util.concurrent развалился бы на части.Я совершенно уверен, что myStatus в одном потоке должен быть ложным, даже если оба пытались поместить туда один и тот же объект.

I guess one hardware implementation of CompareAndSwap would make the threads queue up to do their updates.

Я бы не сказал «очередь» (это звучит как-товыполняется ОС), инструкция CAS будет задерживаться аппаратными средствами.

...