On 05/11/2012 09:36 AM, Jacopo Cappellato wrote:
>
> On May 11, 2012, at 4:26 PM, Adam Heath wrote:
>
>>>>>> @@ -177,10 +184,18 @@ public class GroovyUtil {
>>>>>> Class<?> scriptClass = parsedScripts.get(script);
>>>>>> if (scriptClass == null) {
>>>>>> scriptClass = loadClass(script);
>>>>>> - if (Debug.verboseOn()) Debug.logVerbose("Caching Groovy script: "
>>>>>> + script, module);
>>>>>> - parsedScripts.put(script, scriptClass);
>>>>>> + synchronized (parsedScripts) {
>>>>>> + Class<?> scriptClassCached = parsedScripts.get(script);
>>>>>> + if (scriptClassCached == null) {
>>>>>> + if (Debug.verboseOn()) {
>>>>>> + Debug.logVerbose("Caching Groovy script: " + script, module);
>>>>>> + }
>>>>>> + parsedScripts.put(script, scriptClass);
>>>>>> + } else {
>>>>>> + scriptClass = scriptClassCached;
>>>>>> + }
>>>>>> + }
>>>>>> }
>>>>>> -
>>
>> This is DCL.
>
> Oh no, you are wrong Adam: it would be DCL if scriptClass was a shared
> variable, which is not: it is a *local* variable.
==
result = parsedScripts.get(key)
if (result == null) {
syncyronized (parsedScripts) {
result = parsedScripts.get(key)
if (result == null) {
result = genResult()
parsedScripts.put(key, result)
}
}
}
return result
==
DCL is about the protected resource, parsedScripts. Please try again.
The clue here it to look at what is being protected by the
synchronized keyword.