On 02/20/2014 11:20 AM, David Holmes wrote:
Hi Brian,

On 20/02/2014 7:44 AM, Brian Burkhalter wrote:
This patch concerns cleaning up some ugly internal deprecations.

Issue:    https://bugs.openjdk.java.net/browse/JDK-8035279
Webrev:    http://cr.openjdk.java.net/~bpb/8035279/webrev.00/

All JTREG BigInteger tests pass, and the serialized form has been unaltered as verified by bidirectional read-write testing between Java 7 and this version.

I would appreciate scrutiny of the arithmetic to make sure that I've made no silly errors. Also I would be interested in opinions as to whether the "volatile" keyword should in fact be used for the affected instance variables.

re: volatile

The basic approach being taken with these primitive fields is lazy initialization to a value that will always be the same if recomputed. If the variables are not volatile then in the worst-case (this is theoretical only) they will be recomputed by each thread that accesses them. If they are volatile then they will only be recomputed by threads that truly race on the initialization logic, but you will thereafter pay the price of a volatile read on each access.

Either way you will be functionally correct so it all comes down to performance. Practically speaking I would expect you to be better off overall without the volatile.

As Paul notes the powerCache array does not need to be volatile as it is initialized as part of class initialization.

Cheers,
David

Hi Brian,

I would also be concerned about correctness here. You changed fields to be volatile and assigned them with different that default (zero) values in field initializers. Take for example the field bitCount:

|  156     private volatile int bitCount = Integer.MIN_VALUE;|


In code you check this initial value and decide whether to lazily compute the real value or not based on this check:

3298     public int bitCount() {
3299         // This computation has a known, acceptable non-critical race 
condition.
3300         if (bitCount == Integer.MIN_VALUE) {  // bitCount not initialized 
yet


There has recently been a discussion on concurrency-dev mailing list about whether this is safe:

http://cs.oswego.edu/pipermail/concurrency-interest/2013-November/011951.html

...in cases where the instance of such constructed object escapes to non-constructing thread via data-race. I think the conclusion was that such semantics is desirable and might be guaranteed in a future updated JMM, but currently it is not, although most JVMs are implemented in such a way that this is safe. Citing Doug Lea:

"
Right. To summarize:

* Programmers do not expect that even though final fields are specifically
publication-safe, volatile fields are not always so.

* For various implementation reasons, JVMs arrange that
volatile fields are publication safe anyway, at least in
cases we know about.

* Actually updating the JMM/JLS to mandate this is not easy
(no small tweak that I know applies). But now is a good time
to be considering a full revision for JDK9.

* In the mean time, it would make sense to further test
and validate JVMs as meeting this likely future spec.

-Doug
"

Is there a special reason you changed the "uninitialized" value from default (zero) to non-zero?


Regards, Peter







Reply via email to