lazySet se puede utilizar para la comunicación entre subprocesos, porque xchg es atómico, en cuanto a la visibilidad, cuando el proceso de subproceso de escritor modifica una ubicación de línea de caché, el procesador del subproceso lo verá en la siguiente lectura, porque el protocolo de coherencia de caché intel cpu garantizará que LazySet funcione, pero la línea de caché se actualizará en la próxima lectura, una vez más, la CPU tiene que ser lo suficientemente moderna.
http://sc.tamu.edu/systems/eos/nehalem.pdf Para Nehalem, que es una plataforma multi-procesador, los procesadores tienen la capacidad de “espiar” (espiar) el bus de direcciones de otro procesador de accesos a la memoria del sistema y de sus cachés internos. Usan esta habilidad de espionaje para mantener sus cachés internos consistentes tanto con la memoria del sistema como con las cachés en otros procesadores interconectados. Si un procesador detecta que otro procesador intenta escribir en una ubicación de memoria almacenada en caché en estado Compartido, el procesador invalidará su bloque de caché obligándolo a realizar un relleno de línea de caché la próxima vez que acceda a la misma memoria ubicación.
Oracle JDK punto de acceso para x86 cpu arquitectura->
lazySet == unsafe.putOrderedLong == xchg rw (instrucción asm que sirven como una barrera suave cuesta 20 ciclos de CPU nehelem Intel)
en x86 (x86_64) dicha barrera es mucho más económica que la de Volatile o AtomicLong getAndAdd,
En un productor, un escenario de cola de consumidor, la barrera blanda xchg puede forzar la línea de códigos antes de lazySet (secuencia + 1) para cadena de producción que sucederá ANTES de cualquier código de cadena de consumo que consumirá (trabajará) los nuevos datos, de Por supuesto, el hilo del consumidor deberá verificar atómicamente que la secuencia del productor se incrementó exactamente en uno utilizando un conjunto de parámetros comparar (comparar) y secuencia (secuencia, secuencia + 1).
que remontar después de que el código fuente hotspot podrá encontrar la asignación exacta de la lazySet al código de CPP: http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/prims/unsafe.cpp Unsafe_setOrderedLong -> Definición SET_FIELD_VOLATILE -> OrderAccess: release_store_fence. Para x86_64, OrderAccess: release_store_fence se define como el uso de la instrucción xchg.
Se puede ver cómo se define exactamente en JDK7 (Doug Lea está trabajando en algunas cosas nuevas para JDK 8): http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/4fc084dac61e/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp
también puede utilizar los índices de desarrollo humano a desmontar el conjunto del código lazySet en acción.
Hay otra pregunta relacionada: Do we need mfence when using xchg
¿Alguien podría atontarlo para el resto de nosotros? :( – Gaurav
Lazy es la versión no volátil (por ejemplo, no se garantiza que el cambio de estado sea visible para todos los hilos que tienen el alcance 'Atomic *'). – yawn
Lo que no entiendo es por qué javadoc es tan pobre al respecto –