From 99ed01e3f7c14d3227898beceddfdd08ff2871ec Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 5 Nov 2020 13:11:16 +0100 Subject: [PATCH] Optimize locking in AspectJProxyFactory for concurrent aspect instantiation Closes gh-26034 --- .../annotation/AspectJProxyFactory.java | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AspectJProxyFactory.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AspectJProxyFactory.java index 521762fb0f..ae9e41d6ad 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AspectJProxyFactory.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AspectJProxyFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -160,23 +160,12 @@ public class AspectJProxyFactory extends ProxyCreatorSupport { } /** - * Get the singleton aspect instance for the supplied aspect type. An instance - * is created if one cannot be found in the instance cache. + * Get the singleton aspect instance for the supplied aspect type. + * An instance is created if one cannot be found in the instance cache. */ private Object getSingletonAspectInstance(Class aspectClass) { - // Quick check without a lock... - Object instance = aspectCache.get(aspectClass); - if (instance == null) { - synchronized (aspectCache) { - // To be safe, check within full lock now... - instance = aspectCache.get(aspectClass); - if (instance == null) { - instance = new SimpleAspectInstanceFactory(aspectClass).getAspectInstance(); - aspectCache.put(aspectClass, instance); - } - } - } - return instance; + return aspectCache.computeIfAbsent(aspectClass, + clazz -> new SimpleAspectInstanceFactory(clazz).getAspectInstance()); }