Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

223
Vistas
MutableMap modificado por varios subprocesos y map.size no es igual al recuento de claves

Estoy usando Kotlin y tengo un mutableMap con Key as String, cuando tengo 2 subprocesos que intentan acceder y poner con la misma clave, suceden algunas cosas raras que mi registro muestra que el tamaño del mapa es 2 (no 1), también registro el clave y valor allí, pero solo hay una entrada ...

 @Component class CacheImpl { protected val cache: MutableMap<String, String> = HashMap() //same behavior with ConcurrentHashMap fun fetchFromCache(key: String) { log.info("cache size: ${cache.size}") log.info("cache keys: ${cache.keys}") log.info("cache keys count: ${cache.keys.count()}") cache.computeIfAbsent(id) { key -> fetchFromClient(key) } } } fun serviceCall() { // should fetch from client val result1 = cache.fetchFromCache("123") // should fetch from service val result2 = cache.fetchFromCache("123") }

Así que tengo 2 subprocesos llamando a serviceCall al mismo tiempo, en el registro encontré

 [thread: 2] - cache size: 0 [thread: 4] - cache size: 0 [thread: 2] - cache keys: [] [thread: 4] - cache keys: [] [thread: 2] - cache keys count: 2 [thread: 4] - cache keys count: 2 [thread: 2] - cache size: 2 [thread: 2] - cache keys count: 2 [thread: 2] - cache keys: [123] [thread: 4] - cache size: 2 [thread: 4] - cache keys count: 2 [thread: 4] - cache keys: [123]

También probé con LinkedHashMap y es aún más extraño, en LinkedHashMap puedes ver que mi mapa contiene dos claves exactamente iguales.

 [thread: 2] - cache size: 0 [thread: 4] - cache size: 0 [thread: 2] - cache keys: [] [thread: 4] - cache keys: [] [thread: 2] - cache keys count: 2 [thread: 4] - cache keys count: 2 [thread: 2] - cache size: 2 [thread: 2] - cache keys count: 2 [thread: 2] - cache keys: [123,123] [thread: 4] - cache size: 2 [thread: 4] - cache keys count: 2 [thread: 4] - cache keys: [123,123]
  • ¿No debería Map solo mantener una clave única siempre?
  • ¿Por qué el tamaño de mi mapa no coincide con el número de claves?
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

El HashMap no es seguro para subprocesos, por lo que cuando coloca dos subprocesos, sucedió la escena extraña. Le sugiero que use ConcurrentWeakMap . como dice el doctor

Esta es una implementación muy limitada, no adecuada como reemplazo de un mapa genérico. // Tiene get and put sin bloqueo con refrito sincronizado para simplificar (y mejorar el uso de la CPU en contienda)

Pero solo se asegura de que la operación del mapa sea segura para subprocesos, debe hacer que el método sea seguro para subprocesos.

 @Synchronized fun fetchFromCache(key: String) { log.info("cache size: ${cache.size}") log.info("cache keys: ${cache.keys}") log.info("cache keys count: ${cache.keys.count()}") cache.computeIfAbsent(id) { key -> fetchFromClient(key) } }

Al mismo tiempo, la clave que usa se genera a partir de fetchFromClient, cada vez que devuelve un nuevo objeto. también es la razón. debe usar putIfAbseent , si desea anular el valor que tiene salidas

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda