Tengo una Map
que es leído por múltiples hilos, pero que es (de vez en cuando) se aclaró y reconstruido por otro hilo.
He rodeado todo el acceso a este mapa con
readWriteLock.readLock().lock()
try {
... access myMap here...
} finally {
readWriteLock.readLock().unlock()
}
... o los writeLock()
equivalentes, dependiendo del tipo de acceso.
Mi pregunta es ... será el ReadWriteLock
garantizar que las actualizaciones myMap
son visibles para los otros hilos (ya que deben esperar hasta después de que el unlock()
es llamado por el hilo de la escritura? O, ¿también necesito hacer myMap
un mapa concurrente, como ConcurrentHashMap
?
Probablemente voy a hacer eso, sólo para estar seguro, pero me gustaría entender mejor.
Sí, esto debe estar bien incluso sin un mapa de procesos conscientes. El Javadoc paraReadWriteLock
explícitamente dice:
Todas las implementaciones ReadWriteLock deben garantizar que los efectos de sincronización de memoria de las operaciones WriteLock (como se especifica en la interfaz Lock) también llevan a cabo con respecto a la readLock asociada. Es decir, la adquisición de un hilo con éxito el bloqueo de lectura va a ver todas las actualizaciones hechas a la versión anterior del bloqueo de escritura.
(Por supuesto, mediante el uso de un bloqueo de lectura / escritura en todo lo que depende en el mapa apoyar concurrentes búsquedas de diferentes temas. Uno podría imaginar estructura de datos inteligente que tratar de ahorrar tiempo en general mediante la mutación de algún estado en caché interna durante una búsqueda. Sin embargo, la norma colecciones como HashMap
no lo harán).