2013/1/10 Stuart McCulloch <[email protected]>: > There's no guarantee that Plexus field injection will be synchronized, so if > you're constructing an object in one thread and immediately handing it off to > another >thread without any intervening synchronization then you should use > volatile fields or ideally introduce a synchronized setter+getter in the > outermost object. But even >without injection you'd want to do this if you > were setting values in one thread and wanting another thread to see them.
Ok, this means all the @plexus.requirement fields in wagon should be volatile or similar. > One benefit of JSR330 is that you can use constructor injection along with > final fields which avoids this kind of thread-visibility issue, since they > are frozen and made > visible to other threads when the constructor completes. Constructor injection is king; too bad we can't have that and maven 2.2.1 compatibility...? > PS. you can actually mark a private field as final and still have it > injected, because the reflection code uses "setAccessible" to break through > the encapsulation and >this also overrides the 'final-ness' as described in > http://jeremymanson.blogspot.co.uk/2008/07/immutability-in-java-part-3.html > while still preserving the thread->visibility effect of final - but this is > not recommended as it obscures the actual intent. In one way kind of neat; since the statement has "both" @plexus.requirement and final it's fairly obvious who sets it; although the semantics are definitely not java101 ;) Do you know if this works with old plexus too ? (2.2.1) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
