[
https://issues.apache.org/jira/browse/GROOVY-10142?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Leon A updated GROOVY-10142:
----------------------------
Summary: Infinite loop when clearing Parameterized Type Cache (was:
Infinite loop when clearing tye Parameterized Type Cache)
> Infinite loop when clearing Parameterized Type Cache
> ----------------------------------------------------
>
> Key: GROOVY-10142
> URL: https://issues.apache.org/jira/browse/GROOVY-10142
> Project: Groovy
> Issue Type: Bug
> Components: Static compilation, Static Type Checker
> Affects Versions: 3.0.8
> Reporter: Leon A
> Priority: Major
> Labels: @CompileStatic
>
> I have application that essential makes concurrent calls to a method similar
> to the one below
> {code:java}
> Script compileConcurrently(String source) {
> Script = (Script) groovyClassLoader.parseClass(source).newInstance();
> GenericsUtils.clearParameterizedTypeCache();
> StaticTypeCheckingSupport.clearExtensionMethodCache();
> return script;
> }{code}
> I am running into an issue where one thread gets stuck in an infinite loop in
> theĀ GenericsUtils::clearParameterizedTypeCache method while other threads are
> waiting in GroovyClassLoader::parseClass
> I see PARAMETERIZED_TYPE_CACHE is backed by an access-ordered LinkedHashMap
> guarded with ReadWriteLock. I think the root cause is concurrent
> LinkedHashMap::get calls modifies the order of the map entries and creates a
> loop.
> See
> [LinkedHashMap|https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html]
> api docs
> {noformat}
> Note that this implementation is not synchronized. If multiple threads access
> a linked hash map concurrently, and at least one of the threads modifies the
> map structurally, it must be synchronized externally. This is typically
> accomplished by synchronizing on some object that naturally encapsulates the
> map. If no such object exists, the map should be "wrapped" using the
> Collections.synchronizedMap method. This is best done at creation time, to
> prevent accidental unsynchronized access to the map:
> Map m = Collections.synchronizedMap(new LinkedHashMap(...));
> A structural modification is any operation that adds or deletes one or more
> mappings or, in the case of access-ordered linked hash maps, affects
> iteration order. In insertion-ordered linked hash maps, merely changing the
> value associated with a key that is already contained in the map is not a
> structural modification. In access-ordered linked hash maps, merely querying
> the map with get is a structural modification. )
> {noformat}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)