tapestry-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Thiago H. de Paula Figueiredo (JIRA)" <j...@apache.org>
Subject [jira] [Closed] (TAP5-1520) ConcurrentModificationException while modify unclaimed private collection from different Threads
Date Thu, 05 May 2011 12:35:03 GMT

     [ 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

Mime
View raw message