java - sincronizacion - Sincronización en variable local
variables atomicas java (1)
Inmediatamente después de que el código haya adquirido el monitor del objeto, la referencia al objeto se almacena en la tab
que es la matriz de nodos visible a nivel mundial que conforman el contenido de ConcurrentHashMap
:
Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
if (casTabAt(tab, i, null, r)) {
Justo en este punto, otros subprocesos que ejecutan otros métodos de modificación en el mismo ConcurrentHashMap
pueden encontrar este nodo incompleto al atravesar el conjunto global, en otras palabras, se ha escapado la referencia del Node
.
Mientras que en el punto donde se ha construido el ReservationNode
, no hay posibilidad de contención en un objeto recién creado, en los otros métodos, que se sincronizan en Node
s encontrados en el conjunto, puede haber contención para exactamente ese Node
.
Es como una "sincronización de prioridad". El creador se está sincronizando en un punto donde la referencia no se ha escapado aún, por lo tanto se garantiza que tendrá éxito mientras que en el punto donde se escapa la referencia, todos los otros hilos tendrán que esperar, en el evento improbable (pero aún posible) al que acceden exactamente ese Node
.
Noté una construcción extraña en los métodos compute
y compute
computeIfAbsent
:
Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
//...
}
¿Cuál es el punto de sincronización en un objeto local teniendo en cuenta que es probable que el JIT lo trate como no operativo?