[ 
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

Reply via email to