falsamente: sin razón aparente
Según atomic
javadoc paquete:
Las clases atómicas también apoyan método weakCompareAndSet, que ha aplicabilidad limitada.
En algunas plataformas, la versión débil puede ser más eficiente que compareAndSet en el caso normal, pero difiere en que cualquier invocación dada del método weakCompareAndSet puede devolver false falsamente (es decir, sin razón aparente).
Un retorno falso significa solo que la operación puede reintentarse si se desea, confiando en la garantía de que la invocación repetida cuando la variable contiene expectedValue y que ningún otro hilo intenta establecer la variable finalmente tendrá éxito.
(Tales fallas espúreas pueden deberse, por ejemplo, a los efectos de contención de memoria que no están relacionados con si los valores esperados y actuales son iguales.)
Además, weakCompareAndSet no proporciona garantías de pedido que generalmente se necesitan para el control de sincronización.
Según this thread, no es tanto por el "hardware/OS", pero debido a que el algoritmo subyacente utilizado por weakCompareAndSet:
weakCompareAndSet establece atómicamente el valor de la dado el valor actualizado si el valor actual == el valor esperado. Puede fallar falsamente.
A diferencia compareAndSet(), y otras operaciones en una AtomicX, la operación weakCompareAndSet() no crea ningún happens-before orderings.
Por lo tanto, el hecho de que un hilo vea una actualización de un AtomicX causada por un weakCompareAndSet no significa que esté sincronizado correctamente con operaciones que ocurrieron antes del weakCompareAndSet().
Probablemente no desee utilizar este método, sino que simplemente use compareAndSet; ya que hay pocos casos en que weakCompareAndSet sea más rápido que compare y establece, y hay una serie de casos en los que tratar de optimizar su código utilizando weakCompareAndSet en lugar de compareAndSet introducirá errores de sincronización sutiles y difíciles de reproducir en su código.
nota que se refiere happens-before orderings:
el modelo de memoria de Java (JMM) define las condiciones bajo las cuales se garantiza un hilo de leer una variable para ver los resultados de una escritura en otro hilo .
El JMM define un orden en las operaciones de un programa llamado happens-before.
Ocurre antes: los pedidos entre subprocesos solo se crean sincronizando en un bloqueo común o accediendo a una variable volátil común.
En ausencia de un orden de suceder antes de, la plataforma Java tiene gran libertad para retrasar o cambiar el orden en que las escrituras en un hilo se vuelven visibles para las lecturas de esa misma variable en otro.
Acabo de agregar el motivo técnico, relacionado con el orden de "happen-before" en el JMM (Java Memory Model) – VonC