From: Tatsuya K. <tat...@ma...> - 2002-06-10 18:29:11
|
Hi Max, > Good catch! Upon further investigation thread locals do not need to > be synchronized, after all that is the point of a thread local is to > only be accessed within a given thread ;) So we can remove the > synchronization of the HashMap seeing that a) it is causing problems and > b) it isn't needed. Go ahead and check in option 1! Thanks! OK, I committed ERXThreadStorage.java with the option 1. >> Option 1. Change ERXThreadStorage.storageMap(boolean create) like this: >> >> // CHECKME: Does this need to be synchronized? >> //map = Collections.synchronizedMap(new HashMap(DefaultHashMapSize)); >> map = new HashMap(DefaultHashMapSize); I performed a quick test with WO 5.1's LongRequest example (one with WOLongResponsePage to calculate prime numbers.) I made the app WOAllowsConcurrentRequestHandling YES and run the calculation from three sessions at one time, so I got at least 1 + 3 concurrent threads. Then checked if each thread's storage weren't messed up. It just worked. I pasted the beginning and ending of the result to this email. The children processes showed they were keeping cloned value from their parent in their storage. Thanks, Tatsuya THE BEGINING PART OF THE RESULT (ARRANGED BY TIME) ----------------------------------------------------------------------- Launching LongRequest.woa ... [2002-06-10 13:42:44 EDT] <main> WOAllowsConcurrentRequestHandling=true INFO 13:43:06 (Session:33) -l51N26BNi8U58l2tmIEJqw, localizer() = <ERXLocalizer English> INFO 13:43:38 (Session:33) -WtA7JRZtFbtqMQ3xuyFW9w, localizer() = <ERXLocalizer German> INFO 13:43:49 (Session:33) -GrsNbm2oak0Ajbfk8rYvzw, localizer() = <ERXNonPluralFormLocalizer Japanese> ----------- calculation for English session started ------------- INFO 13:44:07 (Session:33) -l51N26BNi8U58l2tmIEJqw, localizer() = <ERXLocalizer English> INFO 13:44:07 (WOPrimeNumberComputer:71) -child of l51N26BNi8U58l2tmIEJqw, count = 10000, ERXThreadStorage.valueForKey("localizer") = <ERXLocalizer English> INFO 13:44:07 (WOPrimeNumberComputer:71) -child of l51N26BNi8U58l2tmIEJqw, count = 20000, ERXThreadStorage.valueForKey("localizer") = <ERXLocalizer English> [snip] INFO 13:44:09 (Session:33) -l51N26BNi8U58l2tmIEJqw, localizer() = <ERXLocalizer English> INFO 13:44:10 (WOPrimeNumberComputer:71) -child of l51N26BNi8U58l2tmIEJqw, count = 50000, ERXThreadStorage.valueForKey("localizer") = <ERXLocalizer English> INFO 13:44:10 (Session:33) -l51N26BNi8U58l2tmIEJqw, localizer() = <ERXLocalizer English> INFO 13:44:10 (Session:33) -GrsNbm2oak0Ajbfk8rYvzw, localizer() = <ERXNonPluralFormLocalizer Japanese> INFO 13:44:10 (Session:33) -WtA7JRZtFbtqMQ3xuyFW9w, localizer() = <ERXLocalizer German> ------ calculation for German and Japanese sessions started --------- INFO 13:44:10 (WOPrimeNumberComputer:71) -child of WtA7JRZtFbtqMQ3xuyFW9w, count = 40000, ERXThreadStorage.valueForKey("localizer") = <ERXLocalizer German> INFO 13:44:10 (WOPrimeNumberComputer:71) -child of GrsNbm2oak0Ajbfk8rYvzw, count = 10000, ERXThreadStorage.valueForKey("localizer") = <ERXNonPluralFormLocalizer Japanese> INFO 13:44:11 (WOPrimeNumberComputer:71) -child of GrsNbm2oak0Ajbfk8rYvzw, count = 20000, ERXThreadStorage.valueForKey("localizer") = <ERXNonPluralFormLocalizer Japanese> INFO 13:44:11 (WOPrimeNumberComputer:71) -child of l51N26BNi8U58l2tmIEJqw, count = 60000, ERXThreadStorage.valueForKey("localizer") = <ERXLocalizer English> INFO 13:44:11 (WOPrimeNumberComputer:71) -child of WtA7JRZtFbtqMQ3xuyFW9w, count = 50000, ERXThreadStorage.valueForKey("localizer") = <ERXLocalizer German> INFO 13:44:11 (Session:33) -l51N26BNi8U58l2tmIEJqw, localizer() = <ERXLocalizer English> INFO 13:44:11 (WOPrimeNumberComputer:71) -child of GrsNbm2oak0Ajbfk8rYvzw, count = 30000, ERXThreadStorage.valueForKey("localizer") = <ERXNonPluralFormLocalizer Japanese> INFO 13:44:11 (Session:33) -WtA7JRZtFbtqMQ3xuyFW9w, localizer() = <ERXLocalizer German> INFO 13:44:12 (Session:33) -WtA7JRZtFbtqMQ3xuyFW9w, localizer() = <ERXLocalizer German> INFO 13:44:12 (Session:33) -l51N26BNi8U58l2tmIEJqw, localizer() = <ERXLocalizer English> INFO 13:44:12 (Session:33) -GrsNbm2oak0Ajbfk8rYvzw, localizer() = <ERXNonPluralFormLocalizer Japanese> INFO 13:44:12 (WOPrimeNumberComputer:71) -child of WtA7JRZtFbtqMQ3xuyFW9w, count = 60000, ERXThreadStorage.valueForKey("localizer") = <ERXLocalizer German> [snip] THE LAST PART OR THE RESULT (GROUPED BY Session ID) ----------------------------------------------------------------------- INFO 13:44:38 (Session:33) -l51N26BNi8U58l2tmIEJqw, localizer() = <ERXLocalizer English> INFO 13:44:39 (Session:33) -l51N26BNi8U58l2tmIEJqw, localizer() = <ERXLocalizer English> INFO 13:44:38 (Session:33) -WtA7JRZtFbtqMQ3xuyFW9w, localizer() = <ERXLocalizer German> INFO 13:44:39 (Session:33) -WtA7JRZtFbtqMQ3xuyFW9w, localizer() = <ERXLocalizer German> INFO 13:44:38 (Session:33) -GrsNbm2oak0Ajbfk8rYvzw, localizer() = <ERXNonPluralFormLocalizer Japanese> INFO 13:44:39 (Session:33) -GrsNbm2oak0Ajbfk8rYvzw, localizer() = <ERXNonPluralFormLocalizer Japanese> INFO 13:44:38 (WOPrimeNumberComputer:71) -child of l51N26BNi8U58l2tmIEJqw, count = 200000, ERXThreadStorage.valueForKey("localizer") = <ERXLocalizer English> INFO 13:44:39 (WOPrimeNumberComputer:71) -child of l51N26BNi8U58l2tmIEJqw, count = 210000, ERXThreadStorage.valueForKey("localizer") = <ERXLocalizer English> INFO 13:44:35 (WOPrimeNumberComputer:71) -child of WtA7JRZtFbtqMQ3xuyFW9w, count = 200000, ERXThreadStorage.valueForKey("localizer") = <ERXLocalizer German> INFO 13:44:37 (WOPrimeNumberComputer:71) -child of WtA7JRZtFbtqMQ3xuyFW9w, count = 210000, ERXThreadStorage.valueForKey("localizer") = <ERXLocalizer German> INFO 13:44:38 (WOPrimeNumberComputer:71) -child of GrsNbm2oak0Ajbfk8rYvzw, count = 200000, ERXThreadStorage.valueForKey("localizer") = <ERXNonPluralFormLocalizer Japanese> INFO 13:44:40 (WOPrimeNumberComputer:71) -child of GrsNbm2oak0Ajbfk8rYvzw, count = 210000, ERXThreadStorage.valueForKey("localizer") = <ERXNonPluralFormLocalizer Japanese> ----------------------------------------------------------------------- |