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

323
Vistas
ConcurrentHashMap.initTable(), ¿por qué la tabla de verificación es nula dos veces?

Estoy aprendiendo el código fuente de Java, cuando leo el código fuente de ConcurrentHashMap, estoy confundido con el método initTable(), ¿por qué verificar (tab = table) == null || tab.length == 0 dos veces, primero en while() , luego en if() . No puedo imaginar en qué situación necesita el segundo control.

Creo que tal vez sea porque la JVM reordenó el código, puso sizeCtl = sc; delante de Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n]; . Es solo mi suposición, no sé si es correcto.

Alguien me lo puede explicar, muchas gracias.

 private final Node<K,V>[] initTable() { Node<K,V>[] tab; int sc; while ((tab = table) == null || tab.length == 0) { if ((sc = sizeCtl) < 0) Thread.yield(); // lost initialization race; just spin else if (U.compareAndSwapInt(this, SIZECTL, sc, -1)) { try { if ((tab = table) == null || tab.length == 0) { int n = (sc > 0) ? sc : DEFAULT_CAPACITY; @SuppressWarnings("unchecked") Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n]; table = tab = nt; sc = n - (n >>> 2); } } finally { sizeCtl = sc; } break; } } return tab; }
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Múltiples hilos pueden competir para hacer esto (vea el comentario de "carrera de inicialización").

Parafraseando el código:

 while(uninitialized) { acquire_lock(); //compareAndSwapInt... if(uninitialized) { do_init(); } }

El control externo es una prueba "desbloqueada" barata. El interno es en caso de que alguien más ya haya tenido éxito entre while y compareAndSwapInt .

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