Noté el siguiente fragmento de código:

   synchronized (this) {
      if (executed) throw new IllegalStateException("Already executed.");
      executed = true;

¿Es inútil? Después de todo, está sincronizado, entonces, ¿por qué es if (executed) throw new IllegalStateException("Already executed.");?

0
Gilgamesz 13 dic. 2016 a las 21:52

2 respuestas

La mejor respuesta

Noté lo siguiente un fragmento de código ... ¿Es inútil?

Depende mucho del contexto, por supuesto, pero a primera vista, el código hace algo muy específico y útil. Entonces (uh) punto lleno, supongo.

El código asegura que el código debajo del bloque synchronized se ejecute solo una vez. Obviamente, esto es en una aplicación multiproceso. Podría argumentar que todo lo que necesita para esto es un AtomicBoolean, por supuesto:

private final AtomicBoolean executed = new AtomicBoolean();
...
// make sure that this is only executed once
if (!executed.compareAndSet(false, true)) {
    throw new IllegalStateException("Already executed.");
}

El código anterior elimina la necesidad de un bloque synchronized, pero el efecto del código es el mismo. También podría argumentar que el código debería devolver algún tipo de código de error en lugar de arrojarlo, pero ese es un detalle específico de la implementación.

Espero que esto ayude.

1
Gray 15 dic. 2016 a las 19:58

No es inútil.

Sincronizado significa que solo un hilo puede ejecutar ese código en cualquier momento. otros esperarán.

Entonces, al principio ejecutado es "falso". El primer hilo llega a ese código y lo hace verdadero.

El segundo hilo está esperando ...

Cuando el segundo hilo alcanza ese código, la ejecución es "verdadera" y el segundo hilo lanza una excepción.

0
Vadim 13 dic. 2016 a las 19:10