Checkstyle informa este código como "El idioma de bloqueo comprobado doble está roto", pero no creo que mi código realmente se vea afectado por los problemas con el bloqueo comprobado.¿Este bloqueo doble está roto?
Se supone que el código crea una fila en una base de datos si una fila con esa identificación no existe. Se ejecuta en un entorno de subprocesos múltiples y quiero evitar las excepciones SQL de clave primaria.
El pseudo-código:
private void createRow(int id) {
Row row = dao().fetch(id);
if (row == null) {
synchronized (TestClass.class) {
row = dao().fetch(id);
if (row == null) {
dao().create(id);
}
}
}
}
estoy de acuerdo que se parezca bloqueo doble comprobación, pero no estoy usando variables estáticas y el código de fetch() y crear() es probablemente demasiado compleja para ser inlined y poner fuera de servicio.
¿Estoy equivocado o marcado? :)
La suposición de que DAO está sincronizado correctamente es CRÍTICA. –
El problema con esta suposición es que el DAO no tiene idea de lo que espera de él y la próxima posibilidad de código podría arruinar sus esperanzas ... Por lo tanto, creo que esta respuesta es incorrecta * y * ¡peligrosa! –
¿Quiere decir que debería esperarse que el DAO devuelva instancias de objetos que no se inicializan? ¿Por qué importaría si hubiera un bloqueo si puede devolver objetos en mal estado de todos modos? – Dustin