[
https://issues.apache.org/jira/browse/TAP5-1520?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Thiago H. de Paula Figueiredo closed TAP5-1520.
-----------------------------------------------
Resolution: Invalid
Hi!
The error here is in your code: you should never initialize a field with a
non-atomic value. An event handler like onActivate(), @BeginRender or some
event triggered by Form.
Please post in the user mailing list before posting bugs.
Cheers!
Thiago
> ConcurrentModificationException while modify unclaimed private collection
> from different Threads
> ------------------------------------------------------------------------------------------------
>
> Key: TAP5-1520
> URL: https://issues.apache.org/jira/browse/TAP5-1520
> Project: Tapestry 5
> Issue Type: Bug
> Components: tapestry-core
> Affects Versions: 5.2.5
> Reporter: Maxim Ulanovskiy
>
> TestCase: create two parallel requests to the page bellow
> first request to read action - /TestConcurrency.read
> second request to write action - /TestConcurrency.write
> TestConcurrency.tml:
> ...
> <t:actionlink t:id="read">read</t:actionlink>
> <t:actionlink t:id="write">write</t:actionlink>
> ...
> public class TestConcurrency {
> private List<String> testDie = new ArrayList<String>();
>
> public void onActivate() {
> for(int i=0; i<1000; i++)
> testDie.add("init");
> }
> void onActionFromRead() {
> for(String s : testDie)
> System.out.println(s);
> }
> void onActionFromWrite() {
> for(int i=0; i<100000; i++)
> testDie.add("testDie"+i);
> }
> }
> From what I've found out with debugger is that direct access to List<String>
> testDie is replaced with UnclaimedFieldWorker.UnclaimedFieldConduit but when
> PerthreadManagerImpl is called it fails to find thread local value in
> internal map and returnes default value - the same object for both threads:
> public class PerthreadManagerImpl {
> <T> PerThreadValue<T> createValue(final Object key)
> {
> return new PerThreadValue<T>()
> {
> public T get()
> {
> return get(null);
> }
> public T get(T defaultValue)
> {
> Map map = getPerthreadMap();
> // NO SUCH KEY IN map
> if (map.containsKey(key))
> {
> Object storedValue = map.get(key);
> if (storedValue == NULL_VALUE)
> return null;
> return (T) storedValue;
> }
> return defaultValue;
> }
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira