なぜここに原子力を使用していますか?

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];同じようによいでしょう。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=214815&siteId=1