[ https://issues.apache.org/jira/browse/TRINIDAD-2287?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13411898#comment-13411898 ]
Blake Sullivan commented on TRINIDAD-2287: ------------------------------------------ I haven't looked at all of them yet. It is quite possible that some of these are over-synchronized. > atomicity violation bugs of misusing concurrent collections > ----------------------------------------------------------- > > Key: TRINIDAD-2287 > URL: https://issues.apache.org/jira/browse/TRINIDAD-2287 > Project: MyFaces Trinidad > Issue Type: Bug > Affects Versions: 2.0.1-core > Reporter: Yu Lin > Attachments: trinidad-2.0.1.patch > > Original Estimate: 504h > Remaining Estimate: 504h > > My name is Yu Lin. I'm a Ph.D. student in the CS department at > UIUC. I'm currently doing research on mining Java concurrent library > misusages. I found some misusages of ConcurrentHashMap in Trinidad > 2.0.1, which may result in potential atomicity violation bugs or harm > the performance. > The code below is a snapshot of the code in file > trinidad-api/src/main/java/org/apache/myfaces/trinidad/bean/PropertyKey.java > from line 102 to 112 > L102 PropertyKey cachedKey = _sDefaultKeyCache.get(name); > L104 if (cachedKey == null) > L105 { > L106 cachedKey = new PropertyKey(name); > L108 // we don't need putIfAbsent because we don't care about identity > L109 _sDefaultKeyCache.put(name, cachedKey); > L110 } > L112 return cachedKey; > In the code above, an atomicity violation may occur between line 105 > and 109. Suppose a thread T1 executes line 102 and finds out the > concurrent hashmap does not contain the key "name". Before it gets to > execute line 109, another thread T2 puts a pair <name, v> in the > concurrent hashmap "_sDefaultKeyCache". Now thread T1 resumes > execution and it will overwrite the value written by thread T2. Thus, > the code no longer preserves the "put-if-absent" semantics. > I found some similar atomicity violations in other 17 places (I don't > list them one by one. Please see the patch). > Note that in > trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/image/cache/Cache.java, > if we use "putIfAbsent" at line 89 and "replace" at line 115, we may > remove the synchronized keyword at line 82. Similarly, in > trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/RenderKitBase.java, > we may remove the synchronized by using "putIfAbsent" at line 192. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira