I read the article you referred to. It seems to me that this warning (i.e.
the possibility of returning a pointer to an uninitialized object) does not
apply to the case where you are assigning to a local (i.e.. stack) variable
and not some instance variable (i.e. shared memory) and putting that value
in a Map. The example in the article was testing/assigning a static member
variable that could be pointing to an uninitialized object. There is no
possibility of this happening if the test is made on a local stack variable.
Am I incorrect in this interpretation? Or do I still miss something? 

For example if the code in the article had been changed to the following,
there would have been no issue:


    public static Disfunctional_singleton get_instance() 
    { 
        Disfunctional_singleton instance = the_instance;
        if( instance == null ) 
            synchronized( Disfunctional_singleton.class ) 
            { 
                   instance = the_instance;              
               if(instance == null ) {
                    instance = new Disfunctional_singleton(); 
                    new_instance = instance;
                   }
            } 
        return instance; 
    } 

In any case, I am rather shocked by the analysis! I am going to have to look
through all my singleton code now! But I don't think that the "double check"
lock pattern should be thrown away entirely. Thanks for the info. Regards,

--mike

-----Original Message-----
From: Vadim Gritsenko [mailto:[EMAIL PROTECTED]]
Sent: Monday, August 20, 2001 10:28 AM
To: [EMAIL PROTECTED]
Subject: RE: [C2] sitemap creation threading issue ?


According to
http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-toolbox.html
this technique does not work, especially on SMP systems.

Vadim

> -----Original Message-----
> From: Michael McKibben [mailto:[EMAIL PROTECTED]]
> Sent: Monday, August 20, 2001 12:20 PM
> To: '[EMAIL PROTECTED]'
> Subject: RE: [C2] sitemap creation threading issue ?
> 
> 
> I briefly glanced at the patch and one thing you can do to optimize the
> syncronization is to apply the "double check" lock pattern. This will
allow
> you to remove the synchronized keyword from the method.  For example:
> 
> Handler sitemapHandler = (Handler)sitemaps.get(source);
> if (sitemapHandler != null) {
> ...
> }
> 
> Remove synchronized from the method and change body to:
> 
> Handler sitemapHandler = (Handler)sitemaps.get(source);
> if (sitemapHandler == null) {
>       synchronized (sitemaps) {
>               sitemapHandler = (Handler)sitemaps.get(source);
>               if (sitemapHandler == null) {
>                       // create handler, put in the Map ...
>                       sitemaps.put(...)
>               }
>       }
> }
> 
> Notice that threads only get synchronized in the case where a new handler
> has not yet been created, not every call into the method!
> 
> Regards,
> 
> --mike
> 
> -----Original Message-----
> From: Morrison, John [mailto:[EMAIL PROTECTED]]
> Sent: Monday, August 20, 2001 5:47 AM
> To: '[EMAIL PROTECTED]'
> Subject: RE: [C2] sitemap creation threading issue ?
> 
> 
> Hi all, esp Marcus,
> 
> I too have been running Load tests, I also noticed that 'something' was
> happening regularly to slow the response.  I hadn't gotten round to
checking
> the code though (the testing machines are isolated - 0 access from/to my
dev
> station).
> 
> I saw your patch and rejoiced ;) but it's taken the response of some of my
> pages from a couple of hundred milliseconds to over 5!  I've not yet
looked
> at _what_ your patch did, but have you seen a similar increase in time?
> 
> J.
> 
> > -----Original Message-----
> > From: Carsten Ziegeler [mailto:[EMAIL PROTECTED]]
> > Sent: Monday, 20 August 2001 7:57 am
> > To: [EMAIL PROTECTED]
> > Subject: AW: [C2] sitemap creation threading issue ?
> > 
> > 
> > Hi Marcus,
> > 
> > thanks for your patch. I applied it, please cross check :-)
> > 
> > Carsten
> > 
> > > -----Ursprungliche Nachricht-----
> > > Von: Marcus Crafter [mailto:[EMAIL PROTECTED]]
> > > Gesendet: Samstag, 18. August 2001 22:41
> > > An: Cocoon Developers Mailing List
> > > Betreff: [C2] sitemap creation threading issue ?
> > > 
> > > 
> > > Hi *,
> > > 
> > >   Hope all is well.
> > > 
> > >   Michael and I have spent the day testing our C2 application with
> > >   LoadRunner and have potentially uncovered a threading 
> > problem during
> > >   sitemap creation.
> > > 
> > >   We're not experts with the code but from our understanding the
> > >   following is happening, please let us know if we are 
> > right/wrong:
> > > 
> > >   There seems to be a problem with the getHandler() 
> > method, located in
> > >   the sitemap Manager class (line 154). getHandler() attempts 
> > > to access a
> > >   sitemap handler object for each request for processing. If 
> > > the handler
> > >   object is not available it creates one, causing the 
> > sitemap to be
> > >   generated.
> > > 
> > >   We've noticed under load, that many handler objects are 
> > created for
> > >   the same sitemap. This is because getHandler() does not 
> > protect the
> > >   following lines:
> > > 
> > >           Handler sitemapHandler = (Handler)sitemaps.get(source);
> > > 
> > >   and
> > > 
> > >           sitemaps.put(source, sitemapHandler);
> > > 
> > >   as a critical area.
> > > 
> > >   If multiple concurrent threads pass through 
> > getHandler() which are
> > >   requests for resources from the same sitemap, the first line
> > >   above will return null multiple times causing the same 
> > sitemap to be
> > >   compiled several times, each by individual Handler objects.
> > >   
> > >   This happens because sitemaps.put() executes after each 
> > > sitemap handler
> > >   object is created (which can take time for large sitemaps), 
> > > and cannot
> > >   prevent other incoming threads from waiting until it 
> > adds the newly
> > >   created handler object into the 'sitemaps' hashmap.
> > > 
> > >   When we synchronized the getHandler method to protect the
> > >   getting/setting of the sitemaps hashmap, we saw that the sitemap
> > >   handler object was created only once, and that the application
> > >   performed much better under load. Previously the same 
> > > sitemap handler
> > >   object was created as many times as we had simultaneous threads
> > >   make requests.
> > > 
> > >   Attached is a diff of the change we made. There might 
> > be a better
> > >   solution as the Handler class seems to be built to 
> > handle this, it's
> > >   just that the allocation of a new Handler objects per 
> > > sitemap, defeats
> > >   it's internal multi-thread logic.
> > > 
> > >   Any comments/thoughts/suggestions ?
> > > 
> > >   Cheers,
> > > 
> > >   Marcus
> > > 
> > > -- 
> > >         .....
> > >      ,,$$$$$$$$$,      Marcus Crafter
> > >     ;$'      '$$$$:    Computer Systems Engineer
> > >     $:         $$$$:   Open Software Associates GmbH
> > >      $       o_)$$$:   82-84 Mainzer Landstrasse
> > >      ;$,    _/\ &&:'   60327 Frankfurt Germany
> > >        '     /( &&&
> > >            \_&&&&'     Email : [EMAIL PROTECTED]
> > >           &&&&.        Business Hours : +49 69 9757 200
> > >     &&&&&&&:
> > > 
> > 
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, email: [EMAIL PROTECTED]
> > 
> 
> 
> =======================================================================
> Information in this email and any attachments are confidential, and may
> not be copied or used by anyone other than the addressee, nor disclosed
> to any third party without our permission.  There is no intention to
> create any legally binding contract or other commitment through the use
> of this email.
> 
> Experian Limited (registration number 653331).  
> Registered office: Talbot House, Talbot Street, Nottingham NG1 5HF
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, email: [EMAIL PROTECTED]
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, email: [EMAIL PROTECTED]
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to