Hi all,

Ok, let's keep track of this task. I've entered:

"Check synchronization needs for lazy inits"
http://restlet.tigris.org/issues/show_bug.cgi?id=480

Best regards,
Jerome  

> -----Message d'origine-----
> De : Kevin Conaway [mailto:[EMAIL PROTECTED] 
> Envoyé : samedi 5 avril 2008 23:19
> À : [email protected]
> Objet : Re: Evaluating Restlet
> 
> A lot of the lazy initializations seem to be basic 
> Collections.  I don't know of many cases where there is a 
> truly expensive object that is lazy initialized.
> 
> In my use cases, Request and Response objects do not have 
> long lifecycles so carrying around a final, empty Collection 
> here and there might be worth it in relation to possible 
> concurrency issues
> 
> 
> On Sat, Apr 5, 2008 at 12:23 PM, Tim Peierls <[EMAIL PROTECTED]> wrote:
> 
> 
>       On Sat, Apr 5, 2008 at 5:07 AM, Jerome Louvel 
> <[EMAIL PROTECTED]> wrote:
>       
> 
>               Thanks for the suggestion about the safe 
> double-check idiom, very cool. As
>               Request/Response have many optional property 
> and as those are very
>               frequently created objects, I think we should 
> ready try to keep lazy
>               initialization in place.
> 
> 
>       OK. At some point it would be great to do some 
> profiling with and without lazy init to see what effect the 
> extra object creation has.
>       
>       Uh-oh, that probably sounded like volunteering ... 
> maybe I better retract that comment! :-)
>       
>        
>       
> 
>               However, I don't see cases where the 
> Request/Response objects (and dependent
>               objects) would be access by multiple threads 
> *at the same time*, only by
>               different threads at different times if we do 
> async handling or async NIO
>               writing.
>               
>               Could that assumption save us some additional 
> synchronization work?
>               
> 
> 
>       No. As long as there is a window in which one thread 
> can observe the field with a null value before another thread 
> initializes the field, there is a bug. It might be highly 
> unlikely to cause trouble in practice, but that just makes 
> the bug harder to detect when it finally does trigger.
>       
>       The complexity of the double-check lazy init idiom is 
> daunting (to me, anyway), but you're not obliged to use 
> volatiles. Simple synchronization works, too:
>       
>           @GuardedBy("this") private FieldType field;
>       
>           public synchronized FieldType getField() {
>               if (field == null) 
>                   field = initialFieldValue();
>               return field;
>           }
>       
>       @GuardedBy("this") means that *all* access to the field 
> is performed in a synchronized (this) {} block (or a 
> synchronized method). This might be slightly slower than 
> using volatile on some platform/hardware combinations, but 
> it's the *only* way to go if you have a class invariant that 
> involves multiple non-final fields. As I said, I haven't 
> looked hard to see if that is the case with Request, Response, etc.
>       
>       --tim
>       
> 
> 
> 

Reply via email to