You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by "Robert Munteanu (Jira)" <ji...@apache.org> on 2021/01/13 22:22:00 UTC

[jira] [Updated] (SLING-8759) Replace the SlingAdaptable.adapterCache with a ConcurrentMap

     [ https://issues.apache.org/jira/browse/SLING-8759?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Robert Munteanu updated SLING-8759:
-----------------------------------
    Fix Version/s:     (was: API 2.23.2)
                   API 2.23.4

> Replace the SlingAdaptable.adapterCache with a ConcurrentMap
> ------------------------------------------------------------
>
>                 Key: SLING-8759
>                 URL: https://issues.apache.org/jira/browse/SLING-8759
>             Project: Sling
>          Issue Type: Improvement
>          Components: API
>            Reporter: Robert Munteanu
>            Priority: Major
>             Fix For: API 2.23.4
>
>
> The SlingAdaptable.adapterCache is based on a HashMap guarded by a {{synchronized}} block, with lazy initialisation. This looks like a perfect scenario for {{ConcurrentMap.computeIfAbsent}}. The increased memory usage should be measured though, as a simple implementation will not use lazy initialisation, e.g.
> {code}
> diff --git a/src/main/java/org/apache/sling/api/adapter/SlingAdaptable.java b/src/main/java/org/apache/sling/api/adapter/SlingAdaptable.java
> index 5adf0ce..6bed14f 100644
> --- a/src/main/java/org/apache/sling/api/adapter/SlingAdaptable.java
> +++ b/src/main/java/org/apache/sling/api/adapter/SlingAdaptable.java
> @@ -20,6 +20,8 @@ package org.apache.sling.api.adapter;
>  
>  import java.util.HashMap;
>  import java.util.Map;
> +import java.util.concurrent.ConcurrentHashMap;
> +import java.util.concurrent.ConcurrentMap;
>  
>  /**
>   * The <code>SlingAdaptable</code> class is an (abstract) default implementation
> @@ -74,7 +76,7 @@ public abstract class SlingAdaptable implements Adaptable {
>       * are intended to be short-lived to not hold on to objects and classes for
>       * too long.
>       */
> -    private Map<Class<?>, Object> adaptersCache;
> +    private ConcurrentMap<Class<?>, Object> adaptersCache = new ConcurrentHashMap<Class<?>, Object>();
>  
>      /**
>       * Calls into the registered {@link AdapterManager} to adapt this object to
> @@ -94,22 +96,8 @@ public abstract class SlingAdaptable implements Adaptable {
>       */
>      @SuppressWarnings("unchecked")
>      public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
> -        AdapterType result = null;
> -        synchronized ( this ) {
> -            if ( adaptersCache != null ) {
> -                result = (AdapterType) adaptersCache.get(type);
> -            }
> -            if ( result == null ) {
> -                final AdapterManager mgr = ADAPTER_MANAGER;
> -                result = (mgr == null ? null : mgr.getAdapter(this, type));
> -                if ( result != null ) {
> -                    if ( adaptersCache == null ) {
> -                        adaptersCache = new HashMap<Class<?>, Object>();
> -                    }
> -                    adaptersCache.put(type, result);
> -                }
> -            }
> -        }
> -        return result;
> +        return (AdapterType) adaptersCache.computeIfAbsent(type, (klazz) -> {
> +            return ADAPTER_MANAGER.getAdapter(this, type);
> +        });
>      }
>  }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)