Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

222
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!