Yes, you are correct. Too late at night. I missed the synchronized(this) in the methods. Out of curiosity (not that it makes any difference), why aren't the methods just synchronized?

Carsten Ziegeler wrote:

Carsten Ziegeler schrieb:
Ralph Goers wrote:

After looking at the AuthenticationProfileManager code I decided to review the GroupBasedProfileManager. While I'm happy to see the read/write lock stuff gone it seems that getGlobalBaseDatas and getGlobalDatas could have a race condition if two threads run at the same time. Both threads could very well create the CopletBaseData or worse getGlobalBaseDatas might clear copletDatas.object right after the other thread has set it in getGlobalDatas.

Argh, you're right - now, the methods are synchronized...but obviously
that doesn't help. I must have written this code directly after some
party I guess. I'll have a look at it today.

Ok, perhaps the code isn't that bad...now, both methods
(getGlobalBaseDatas and getGlobalDatas) are synchronized, so only one
thread can enter them and therefore only one thread can change the
corresponding objects. At the end of the method, the map is returned and
this return value is then used for the current user profile.
So, if now another thread is entering the getGlobalBaseDatas method and
overwriting the copletBaseDatas.objects value, the first user is not
affected as he is working on his copy. At least this is how I think it
should work. WDYT?

Carsten