I think that is correct. Assuming the 'next' is volatile, right? On Fri, Aug 26, 2011 at 10:36 AM, Rickard Öberg <[email protected]> wrote: > On 8/25/11 23:49 , Stuart McCulloch wrote: >> >> On 25 Aug 2011, at 09:34, Rickard Öberg<[email protected]> wrote: >> >>> On 8/25/11 15:42 , Niclas Hedhman wrote: >>>> >>>> Who knows?? >>>> >>>> I think there is at least one problem; If threadA is interrupted >>>> between the lines in returnInstance(), then the 'next' field in the >>>> now 'first' referenced CompositeMethodInstance, will point to.... yes, >>>> what?? Meaning that another thread would take the returned value, but >>>> set the 'first' to a spurious value, and only a thread after that >>>> might be buggered up. Yes, a long shot, and possibly hard to verify or >>>> trigger... >>> >>> No, because of the getAndSet() thing that can't happen. The second >>> interrupting thread would get the value that was set by the first one, so >>> that's fine. >> >> Niclas is correct - there's a small window between the getAndSet call and >> fixing up the instance's next field where another thread may grab it >> >> The method to return the instance to the pool should have the same sort of >> compare loop - ie. get current value, use that in setNext, then and only >> then compareAndSet the instance >> >> That way if there's a clash you'll just go round the loop again, and never >> put back an instance without a correct next value > > Ah ok, then I understand. So this should work then: > public void returnInstance( CompositeMethodInstance > compositeMethodInstance ) > { > CompositeMethodInstance firstInstance; > do > { > firstInstance = first.get(); > compositeMethodInstance.setNext( firstInstance ); > } while(!first.compareAndSet( firstInstance, compositeMethodInstance > )); > } > --- > > /Rickard > > _______________________________________________ > qi4j-dev mailing list > [email protected] > http://lists.ops4j.org/mailman/listinfo/qi4j-dev >
-- Niclas Hedhman, Software Developer http://www.qi4j.org - New Energy for Java I live here; http://tinyurl.com/3xugrbk I work here; http://tinyurl.com/24svnvk I relax here; http://tinyurl.com/2cgsug _______________________________________________ qi4j-dev mailing list [email protected] http://lists.ops4j.org/mailman/listinfo/qi4j-dev

