Duplicar posibles:
What is the best way to increase number of locks in javaSincronización en un valor entero
Supongamos que desea bloquear basa en un valor entero de identificación. En este caso, hay una función que extrae un valor de un caché y realiza una recuperación/almacenamiento bastante caro en el caché si el valor no está allí.
múltiples operaciones El código existente no está sincronizado y potencialmente podría desencadenar recuperar/Tienda:
//psuedocode
public Page getPage (Integer id){
Page p = cache.get(id);
if (p==null)
{
p=getFromDataBase(id);
cache.store(p);
}
}
Lo que me gustaría hacer es sincronizar el recuperar en la identificación, por ejemplo,
if (p==null)
{
synchronized (id)
{
..retrieve, store
}
}
Por desgracia, esto no funcionará porque 2 llamadas separadas pueden tener el mismo valor entero Identificación sino un objeto Integer diferente, por lo que no compartirán la cerradura y ninguna sincronización ocurrirá.
¿Existe una manera simple de asegurar que tiene la misma instancia de Integer? Por ejemplo, es que esto funciona:
syncrhonized (Integer.valueOf(id.intValue())){
el Javadoc para Integer.valueOf() parece dar a entender que es muy probable que obtener el mismo ejemplo, pero que no se ve como una garantía:
Devuelve una instancia de Entero que representa el valor int especificado. Si no se requiere una nueva instancia Integer, este método debe generalmente ser utilizado con preferencia a la constructor entero (int), ya que este método es probable que el rendimiento significativamente mejor espacio y el tiempo rendimiento mediante el almacenamiento en caché frecuencia solicitados valores.
¿Alguna sugerencia sobre cómo obtener una instancia de Integer que garantice que es la misma, aparte de las soluciones más elaboradas, como mantener un WeakHashMap de objetos de bloqueo en clave de int? (No hay nada de malo en eso, parece que debe haber un obvio de una línea que me falta).
¡Esta pregunta "duplicada" y la respuesta de Eddie a continuación son mejores que la pregunta "original"! – arun
Vea también http://stackoverflow.com/questions/6616141/java-threads-locking-on-a-specific-object específicamente http://stackoverflow.com/a/27806218/32453 – rogerdpack
¿Qué pasa con el uso de [AtomicInteger] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html)? – GregT