Зачем использовать Atomic здесь? - PullRequest
3 голосов
/ 06 марта 2019

Читая исходный код 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 Ответ

1 голос
/ 06 марта 2019

Каждый вызов hasAnnotatedMethods получает свой собственный экземпляр found, поэтому контекст, из которого вызывается hasAnnotatedMethods, не имеет значения.

возможно , что ReflectionUtils.doWithMethods вызывает метод doWith из нескольких потоков, что потребует doWith для обеспечения безопасности потока.

Я подозреваю, что AtomicBoolean просто используется для возврата значения из обратного вызова, и что boolean[] found = new boolean[1]; будет делать то же самое.

...