Dirk,

But this is why the happens-before relationship is important. The component is 
not published as a service until after activation, therefore no other thread 
can obtain visibility in order to “hit” it until after the references are bound.

For this reason, static @Reference fields do not need to be volatile.

Regards,
Neil



> On 1 May 2017, at 22:05, Dirk Hogan <dirk.ho...@forgerock.com> wrote:
> 
> Hi Neil-
> 
> I was not so worried about the happens-before relationship between
> setting the @Reference and activating the component. This relationship
> could be provided by the memory visibility guarantees of the program
> order defined in the JMM, provided @Reference set and component
> activation occurred in the same thread.
> 
> 
> I was more worried about some other thread (e.g. client request)
> hitting this component, and, in the process, dereferencing the
> @Reference, as this will involve inter-thread memory visibility, and
> as such, a synchronization action to ensure that a memory read sees
> the state written by OSGi thread which wrote the @Reference.
> 
> 
> Thanks
> 
> 
> Dirk
> 
> 
> 
> The Declarative Services spec requires that there is a happens-before
> relationship between SCR setting the field and activating the component
> instance — see OSGi Compendium 6.0.0 section 112.3.8.1.
> 
> There are various ways of achieving this under the Java Memory Model. For
> example the SCR implementation can use internal synchronized blocks.
> 
> Regards,
> Neil
> 
>> On 27 Apr 2017, at 17:33, Dirk Hogan <dirk.ho...@forgerock.com> wrote:
>> 
>> I have been puzzled about the visibility of references written/read across
>> threads in Felix.
>> 
>> Scenario:
>> 
>> public class myOSGiComponent {
>> 
>> @Reference
>> 
>> SomeOtherOSGiService myServiceReference;
>> 
>> public void activate(ComponentContext cc) {
>> 
>> // myServiceReference will be set - use it to initialize other
>> dependencies, etc
>> 
>> }
>> 
>> public void clientRequestViaEmbeddedJetty() {
>> 
>> myServiceReference.foo();
>> 
>> }
>> 
>> The bottom line is that a STATIC reference does not have to be volatile. I
>> can see that the write to myServiceReference is guaranteed to be visible in
>> the activate method, provided that same Felix thread which set
>> myServiceReference invokes activate, and thus the visibility is guaranteed
>> by program order (17.4.3 of the Java Language Spec).
>> 
>> However, in the absence of the synchronization action provided by e.g. a
>> volatile @Reference declaration, I do not see how Felix can provide a Java
>> Memory Model compliant guarantee that myServiceReference will be visible in
>> clientRequestViaEmbeddedJetty, as the thread which set the reference, and
>> the thread which invokes clientRequestViaEmbeddedJetty, will be distinct.
>> In the absence of a volatile @Reference declaration, there is no
>> synchronization action (17.4.2 of JLS) which would guarantee that the
>> reference write is visible to the reference read, as they are being
>> performed by distinct threads.
>> 
>> Perhaps an explanation as to why a DYNAMIC @Reference does need to be
>> volatile would be helpful - e.g. why does component
>> de-activation/re-activation provide memory visibility guarantees for STATIC
>> references?
>> 
>> 
>> Thanks
>> 
>> 
>> Dirk

Reply via email to