<div>Hello Peter,</div><div><br class="webkit-block-placeholder"></div><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">An other approach, not based on the ability of the JIT optimizing your code, could merge benefits of the two approach : keeping the ability to update the statistics variable while not adding overhead of a volatile variable, at the expense of increased code complexity.</p>

<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">The way I understand your problem make me believe the foo() method invocation ratio should be quite high over the amount of updates between having or not statistics for your foo object. I also presume the clients of your foo objects accomplish some kind of large amount of treatments split over some kind of &quot;work units&quot;.</p>

<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">If this is the case, you may want to encapsulate your foo instance behind some kind of monitor. Access to the foo instance would go through the monitor and a synchronized bloc would ensure the memory visibility over the &quot;statistics&quot; field. The same technique would be used to set or unset the FooStatistics object on the foo instance.</p>

<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">You could use something like this :</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">FooMonitor {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    private final Foo foo;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    FooMonitor(Foo foo) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">        this.foo = foo;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    }</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    public synchronized Foo getFoo() { return foo;}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    public synchronized void setStatistics(FooStatistics stats} {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">        foo.setStatistics(stats);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    }</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">While this approach is more slow than accessing a single volatile field this code is invoked much more rarely and could/should outperform the use of the volatile field. However, note that you can&#39;t predict if the current working unit may eventually see or not the update in the middle of its execution. </p>

<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">For statistics purposes this might sound ok but depending on your needs and requirements you could use a mutual exclusion policy over the foo instance in order to grant when the statistic object would be visible by the clients of the foo instance. This last point make the solution even more complex and requires strong coding discipline and extensive testing.</p>

<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">The (probably wrong) sketch currently in my mind would look like this (with no fairness consideration in mind) :</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">FooMonitor {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    private final Foo foo;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    private boolean accessible = true;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    private Object lock = new Object();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    FooMonitor(Foo foo) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">        this.foo = foo;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    }</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    public Foo getFoo() {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">        synchronized(lock) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">            while(!accessible) wait();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">            accessible = false;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">            return foo;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">        }</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    }</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    public void releaseFoo() {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">        synchronized(lock) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">            accessible = true;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">        }</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    }</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    public void setStatistics(FooStatistics stats} {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">        synchronized(lock) {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">            while(!accessible) wait();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">            foo.setStatistics(stats);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">        }</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">    }</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">}</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">Of course both solutions should only be considered under extreme seek for performance (but if for you every read/write to CAS/volatile variables counts, this seems to be the case.) and I even wouldn&#39;t consider using the last solution with only the argument of performance in mind (I would rather upgrade the server or add a node to the cluster).</p>

<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">Regards,</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana">Pierre.</p>
<br><div class="gmail_quote">2009/5/5 Peter Veentjer <span dir="ltr">&lt;<a href="mailto:alarmnummer@gmail.com">alarmnummer@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
I have a question about the JIT and optimisations.<br>
<br>
Is the JIT able to remove conditions based on volatile fields?<br>
<br>
e.g.<br>
<br>
class FooStatistics{.....}<br>
<br>
class Foo{<br>
<br>
   private final FooStatistics statisics;<br>
<br>
   public Foo(FooStatistics statistics){<br>
       this.statistics = statistics<br>
   }<br>
<br>
   void foo(){<br>
      ... some logic<br>
<br>
      if(statistics!=null)<br>
           statistics.incSomeCasCounter();<br>
   }<br>
<br>
}<br>
<br>
If I create a Foo with a null as statistics, the statistics part is<br>
completely removed and my foo method is transformed to:<br>
<br>
void foo(){<br>
    ..... some logic<br>
}<br>
<br>
The problem is that you can&#39;t activate/deactivate statistics on an<br>
existing object. So you could create something like this:<br>
<br>
class Foo{<br>
<br>
   private volatile FooStatistics statisics;<br>
<br>
   public Foo(FooStatistics statistics){<br>
       this.statistics = statistics<br>
   }<br>
<br>
   public void setStatistics(FooStatistics statistics){<br>
      this.statistics = statistics;<br>
   }<br>
<br>
   void foo(){<br>
      ... some logic<br>
<br>
      if(statistics!=null)<br>
           statistics.incSomeCasCounter();<br>
   }<br>
<br>
}<br>
<br>
In this case I presume the JIT will have a very hard time removing the<br>
statistics logic and as an additional cost, the system needs to access<br>
an &#39;expensive&#39; volatile variable.<br>
<br>
I&#39;m working on an STM implementation, and every read/write to<br>
CAS/volatile variables counts..<br>
<br>
So.. can anyone tell me if the final approach is the only way to go?<br>
Or is the JIT able to do some magic like speculative removal of code..<br>
and re-adding it if it is needed?<br>
<br>
Peter<br>
_______________________________________________<br>
Concurrency-interest mailing list<br>
<a href="mailto:Concurrency-interest@cs.oswego.edu">Concurrency-interest@cs.oswego.edu</a><br>
<a href="http://cs.oswego.edu/mailman/listinfo/concurrency-interest" target="_blank">http://cs.oswego.edu/mailman/listinfo/concurrency-interest</a><br>
</blockquote></div><br>