为什么在这里使用Atomic?

时间:2019-03-06 01:46:21

标签: java spring java.util.concurrent

在阅读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()的源代码,但没有在其中找到任何并发调用。

1 个答案:

答案 0 :(得分:1)

每次调用hasAnnotatedMethods都会获得自己的found实例,因此调用hasAnnotatedMethods的上下文无关紧要。

ReflectionUtils.doWithMethods从多个线程调用doWith方法是有可能的,这将要求doWith是线程安全的。

我怀疑AtomicBoolean仅用于从回调中返回值,而boolean[] found = new boolean[1];也可以这样做。