Can't you just fix this by using a ConcurrentHashMap or a ConcurrentReaderHashMap from 
the EDU.oswego.cs.dl.util.concurrent package for the expressions?
So the code would be something like:

   public static Object compile(String expression) throws OgnlException {
         Object o = null;
 
         o = expressions.get(expression);
 
         if (o == null) {
                     o = Ognl.parseExpression(expression);
                     expressions.put(expression, o);
         }
 
         return o;
     }
 
The map does not store null keys or values so you have to be sure the expression is 
not null and the Ognl.parseExpression does not return null.

Cheers,

Dick Zetterberg
[EMAIL PROTECTED]

----- Original Message ----- 
From: "Patrick Lightbody" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, October 09, 2003 7:10 AM
Subject: RE: [OS-webwork] Bug catching contest...


> Yeah, I wrote that and recently found out the reasons why it's faulty --
> stupid memory model :)
> 
> Can you file a bug on this?
> 
> -Pat
> 
> 
> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On Behalf Of
> Micha³ Mosiewicz
> Sent: Tuesday, October 07, 2003 4:01 AM
> To: opensymphony-webwork
> Subject: [OS-webwork] Bug catching contest...
> 
> This code won't work as you would expect. It's that kind of bug you
> wouldn't
> expect, but also that kind that should be taught on every programming
> course
> (rare).
> 
> For those who are impatient and don't want to find out why it won't work
> I
> suggest googling for "double checked locking" or DCL. Due to java memory
> model (as matter of fact it's not only java) the code below doesn't
> work.
> 
> I strongly suggest to pass xwork/webwork through checkstyle. I suppose
> there
> might be more. Of course - in this place it doesn't really matter if it
> synchronized or not - it's just a matter of optimisation. But the same
> idiom
> might be multiplied.
> 
> OgnlUtil.compile():
> 
>   public static Object compile(String expression) throws OgnlException {
>         Object o = null;
> 
>         o = expressions.get(expression);
> 
>         if (o == null) {
>             synchronized (expressions) {
>                 o = expressions.get(expression);
> 
>                 if (o == null) {
>                     o = Ognl.parseExpression(expression);
>                     expressions.put(expression, o);
>                 }
>             }
>         }
> 
>         return o;
>     }
> 
> 



-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
SourceForge.net hosts over 70,000 Open Source Projects.
See the people who have HELPED US provide better services:
Click here: http://sourceforge.net/supporters.php
_______________________________________________
Opensymphony-webwork mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork

Reply via email to