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

Leonardo Uribe resolved MYFACES-3705.
-------------------------------------

       Resolution: Fixed
    Fix Version/s: 2.1.12
    
> Concurrency "feature" in FaceletCacheImpl
> -----------------------------------------
>
>                 Key: MYFACES-3705
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3705
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: General
>    Affects Versions: 2.1.0
>         Environment: All
>            Reporter: Pasi Salminen
>            Assignee: Leonardo Uribe
>            Priority: Trivial
>             Fix For: 2.1.12
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> I'm implementing my own FaceletCache which is decorating 
> org.apache.myfaces.view.facelets.impl.FaceletCacheImpl by adding my own 
> caching policy. When I was studying the code I'm decorating, I noticed that 
> scrictly speaking it was not behaving. The problem lies in this code snippet 
> (and the same for metadata facelets):
>             if (_refreshPeriod != NO_CACHE_DELAY)
>             {
>                 Map<String, DefaultFacelet> newLoc = new HashMap<String, 
> DefaultFacelet>(_facelets);
>                 newLoc.put(key, f);
>                 _facelets = newLoc;
>             }
> First of all, multiple concurrent modifications of _facelets map may cause 
> lost updates. Think what happens when thread one copies the hashmap, updates 
> local copy but before it sets the reference, thread b does the same. One 
> update is now lost. In reality, the number of concurrent threads and number 
> of lost updates may be much larger. The second thing is that the new 
> reference set to _facelets is not quaranteed to be visible to other threads 
> due to missing synchronization. To prove my concerns, I created a small test 
> bench which proved my doubts and was able to show both lost updates and 
> visibility problem. When I modified the map to be ConcurrentHashMap and just 
> used put-method all problems vanished. So instead of
>                 Map<String, DefaultFacelet> newLoc = new HashMap<String, 
> DefaultFacelet>(_facelets);
>                 newLoc.put(key, f);
>                 _facelets = newLoc;
> I used
>                 _facelets.put( key,f );
> I know it may not be a problem, possibly just causing multiple loads of same 
> resource, but still I don't feel comfortable with the code behaving 
> concurrency-wise incorrectly.
> BR, Paci

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to