<div dir="ltr">Hi Michael,<div><br></div><div><div>> we have a race condition problem using the DefaultAutoscaleService. If</div><div>> the methods() method is called from several threads at the same time</div><div>> the first invocation will enter buildDataStructures and generate the</div>


<div>> methods object. However the 2nd... invocation can pass the "if</div><div>> condition" even if methods has not yet been filled by</div><div>> buildDataStructures.</div></div><div><br></div><div>Yes, many of the ImageJ2, SciJava Common and SCIFIO services have been updated to initialize their data structures only as needed. This has greatly sped up context creation, at the cost of potential threading issues and unintuitive code execution order. Services patterned this way are known to be *not* thread-safe, so your workaround is the short-term solution here.</div>


<div><br></div><div><div>> Our workaround synchronizes some of our code but it would be more</div><div>> efficient if the DefaultAutoscaleService could handle this.</div></div><div><br></div><div>We need to make a decision about whether services patterned this way should be thread-safe or not. They probably should be, but it's tricky. What I want to avoid is the negative performance impact of synchronizing when not completely necessary.</div>


<div><br></div><div>I filed a ticket for this work:</div><div><a href="http://trac.imagej.net/ticket/1980" target="_blank">http://trac.imagej.net/ticket/1980</a><br></div><div><br></div><div>Regards,</div><div>Curtis</div>

<div class="gmail_extra">
<br><br><div class="gmail_quote">On Thu, Aug 15, 2013 at 7:25 AM, Michael Zinsmaier <span dir="ltr"><<a href="mailto:michael.zinsmaier@gmx.de" target="_blank">michael.zinsmaier@gmx.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


Hi Curtis,<br>
<br>
we have a race condition problem using the DefaultAutoscaleService. If the methods() method is called from several threads at the same<br>
time the first invocation will enter buildDataStructures and generate the methods object. However the 2nd... invocation can pass the "if condition" even if methods has not yet been filled by buildDataStructures.<br>



<br>
This happens in KNIP if we execute several plugins that rely on this service at the same time (and for the first time).<br>
Our workaround synchronizes some of our code but it would be more efficient if the DefaultAutoscaleService could handle this.<br>
<br>
Best regards Michael<br>
<br>
------------------------------<u></u>------------------------------<u></u>-----------------<br>
<br>
DefaultAutoscaleService<br>
<br>
    private void buildDataStructures() {<br>
        methods = new ConcurrentHashMap<String, AutoscaleMethod>();<br>
        methodNames = new ArrayList<String>();<br>
        for (final AutoscaleMethod method : getInstances()) {<br>
            final String name = method.getInfo().getName();<br>
            methods.put(name, method);<br>
            methodNames.add(name);<br>
        }<br>
    }<br>
<br>
    private Map<? extends String, ? extends AutoscaleMethod> methods() {<br>
        if (methods == null) buildDataStructures();<br>
        return methods;<br>
    }<br>
</blockquote></div><br></div></div>