<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">I have a system that processes a lot of Doubles.  From time to time I need the accuracy of BigDecimal math but creating a BigDecimal is relatively expensive so I only do it when needed.  Hence I use lazy initialization as shown below.<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">    </span>private Double price;  // although not final is effectively immutable and guaranteed non-null when used below<br><span class="Apple-tab-span" style="white-space:pre">      </span>private transient BigDecimal priceBD;<br><br></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>public BigDecimal getPriceBD() {<br><span class="Apple-tab-span" style="white-space:pre">             </span>if (priceBD == null) {<br><span class="Apple-tab-span" style="white-space:pre">                     </span>priceBD = BigDecimal.valueOf(price);  // strict singleton semantics not required<br><span class="Apple-tab-span" style="white-space:pre">                </span>}<br><span class="Apple-tab-span" style="white-space:pre">         </span>return priceBD;<br><span class="Apple-tab-span" style="white-space:pre">      </span>}<br><br><div>This particular construction method does not use one of the MathContext based constructors but it was while investigating the thread safety of this approach that I noticed that some of the constructors may not be safe.</div><div><br></div><div>My concern is whether using this technique a second thread might see a BigDecimal that is not fully initialized.  I'm pretty sure it can, but it wouldn't matter if the volatile intVal is enforcing happens-before in subsequent calls to the BigDecimal, however the constructors that delegate to the method mentioned do things after setting the intVal.</div><div><br></div><div><div><div>On 20 Aug 2012, at 12:32, Sergey Kuksenko <<a href="mailto:skuksenko@gmail.com">skuksenko@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hi James,<div><br></div><div>- Look into jdk8 sources. New  BigDecimal has final fields (instead of volatile).</div><div>- Could you explain what is the issue for safe publication in the old code (look like everything is ok)?<br>
<br><div class="gmail_quote">On Mon, Aug 20, 2012 at 2:58 PM, James <span dir="ltr"><<a href="mailto:james@inaseq.com" target="_blank">james@inaseq.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I'm wondering whether the BigDecimal constructors that take a MathContext parameter exhibit initialization safety.  As far as I can tell (and I could be very wrong), BigDecimal is relying on the volatile nature of the intVal reference to ensure the BigDecimal is effectively immutable.  However, the constructors that take a MathContext delegate to the following method, which alters other members after intVal:<br>

<br>
    private void roundThis(MathContext mc) {<br>
        BigDecimal rounded = doRound(this, mc);<br>
        if (rounded == this)                 // wasn't rounded<br>
            return;<br>
        this.intVal     = rounded.intVal;<br>
        this.intCompact = rounded.intCompact;<br>
        this.scale      = rounded.scale;<br>
        this.precision  = rounded.precision;<br>
    }<br>
<br>
Is this a potential issue for safe publication or am I missing something?<br>
Is BigDecimal intended to exhibit initialization safety?<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><br clear="all"><div><br></div>-- <br>Best regards,<br>Sergey Kuksenko<br>
</div>
</blockquote></div><br></div></div></body></html>