raging_sweet:
Mientras lee el código fuente de SpringRetry, me encuentro con este fragmento de código:
private static class AnnotationMethodsResolver {
private Class<? extends Annotation> annotationType;
public AnnotationMethodsResolver(Class<? extends Annotation> annotationType) {
this.annotationType = annotationType;
}
public boolean hasAnnotatedMethods(Class<?> clazz) {
final AtomicBoolean found = new AtomicBoolean(false);
ReflectionUtils.doWithMethods(clazz,
new MethodCallback() {
@Override
public void doWith(Method method) throws IllegalArgumentException,
IllegalAccessException {
if (found.get()) {
return;
}
Annotation annotation = AnnotationUtils.findAnnotation(method,
annotationType);
if (annotation != null) { found.set(true); }
}
});
return found.get();
}
}
Mi pregunta es, ¿por qué usar AtomicBoolean
como variable local aquí? He comprobado el código fuente de RelfectionUtils.doWithMethods()
y no encontrar ninguna invocación de concurrencia allí.
tgdavies:
Cada invocación hasAnnotatedMethods
obtiene su propia instancia de found
, por lo que el contexto en el que hasAnnotatedMethods
se llama no importa.
Es posible que ReflectionUtils.doWithMethods
llama al doWith
método de múltiples hilos, lo que requeriría doWith
ser segura hilo.
Sospecho que AtomicBoolean
solo se utiliza para devolver un valor de la devolución de llamada, y que boolean[] found = new boolean[1];
podría hacer igual de bien.