Looking more into this, it looks like there is some legacy code that results in so many dispatch queue threads being instantiated:

* map package uses static default EM (2 threads)
* each Configuration instance uses its own EM (+5 threads per Configuration)

Some cleanup is due here. The first case is really legacy stuff used by the Modeler. No need to carry it over in runtime. The second case can be improved. First CAY-610 needs to be fixed [1], second, we may implement a smarter dispatch thread pooling, shutting down unused threads.

To summarize, there is nothing critically broken in the current implementation, but cleaning it up is desirable at some point. BTW, I changed shared EM instance to be 'volatile', but I don't think it caused us any grief to date.

Andrus

[1] https://issues.apache.org/cayenne/browse/CAY-610


On Mar 30, 2007, at 4:40 PM, Andrus Adamchik wrote:

Interesting. Didn't know it was a known problem with java 1.4.

Lazy initialization was used exactly because we don't want dispatch threads to start unless they are needed. So ... per Wikipedia article this is a legacy JDK problem and going forward we should simply be using "volatile" keyword, which I think we should.

Andrus


On Mar 30, 2007, at 1:10 AM, Peter Karich wrote:
Hello!

I profile my application with netbeans profiler.
And I figured out that there are 12 (!) EventManager's DispatchThreads
started.
All are in the 'waiting' state.
I have no problems with that :-)
But could it be that this code is problematic:

public static EventManager getDefaultManager() {
        if (defaultManager == null) {
            synchronized (EventManager.class) {
                if (defaultManager == null) {
                    defaultManager = new EventManager(2);
                }
            }
        }
        return defaultManager;
    }

See the problems with double checked locking here:

http://en.wikipedia.org/wiki/Double-checked_locking

Particularly the section:
"One of the dangers of using double-checked locking in J2SE 1.4 ..."

A simple solution can be:

private static EventManager defaultManager = new EventManager(2);
public static EventManager getDefaultManager() {
        return defaultManager;
}

OR a full synchronized method.

Peter.




Reply via email to