raging_sweet:
SpringRetryのソースコードを読んでいる間、私はこのコードスニペットに遭遇します:
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();
}
}
私の質問は、なぜ使用して、あるAtomicBoolean
ここではローカル変数として?私はのソースコードをチェックしてRelfectionUtils.doWithMethods()
、そこに任意の同時実行の呼び出しを見つけることができませんでした。
tgdavies:
各呼び出しはhasAnnotatedMethods
独自のインスタンスを取得しfound
、そこからコンテキストので、hasAnnotatedMethods
呼び出されたが、問題ではありません。
可能そのReflectionUtils.doWithMethods
呼び出すdoWith
必要となる複数のスレッドからメソッドをdoWith
、スレッドセーフです。
私はそれを疑うAtomicBoolean
ばかりのコールバックから値を返すために使用されている、それはboolean[] found = new boolean[1];
同じようによいでしょう。