[concurrency-interest] JLS 17.7 Non-atomic treatment of double and long : Android
Mark Thornton
mthornton at optrak.com
Tue Apr 30 11:26:56 EDT 2013
On 30/04/13 15:36, Tim Halloran wrote:
> On Mon, Apr 29, 2013 at 4:59 PM, Aleksey Shipilev
> <aleksey.shipilev at oracle.com <mailto:aleksey.shipilev at oracle.com>> wrote:
>
> Yes, that's exactly what I had in mind:
> a. Declare "long a"
> b. Ramp up two threads.
> c. Make thread 1 write 0L and -1L over and over to field $a
> d. Make thread 2 observe the field a, and count the observed values
> e. ...
> f. PROFIT!
>
> P.S. It is important to do some action on value read in thread 2, so
> that it does not hoisted from the loop, since $a is not supposed to be
> volatile.
>
> -Aleksey.
>
>
> This discussion is getting a bit far afield, I guess, but to get back
> onto the topic. I followed Aleksey's advice. And wrote an
> implementation that tests this. I used two separate threads to write
> 0L and -1L into the long field "a" but that is the only real change I
> made. (I already had some scaffolding code to run things on Android or
> desktop Java).
>
> *Android: splits writes to longs into two parts.*
>
> On a Samsung Galaxy II with Android 4.0.4 a Nexus 4 phone with
> Android 4.2.2 I saw non-atomic treatment of long. The value
> -4294967296 (xFFFFFFFF00000000) showed up as well as 4294967295
> (x00000000FFFFFFFF).
>
> So looks like Android does not follow the (albeit optional) advice in
> the Java language specification about this.
>
> *JDK: DOES NOT split writes to longs into two parts (even 32-bit
> implementations)*
>
> Of course we couldn't get this to happen on any 64-bit JVM, but we
> tried it out under Linux on 32-bit OpenJDK 1.7.0_21 it does NOT
> happen. The 32-bit JVM implementations follow the recommendation of
> the Java language specification.
>
> An interesting curio. I wonder how many crashes in "working" Java code
> moved from desktop Java onto Android programmers are going to lose
> sleep tracking down this one.
>
>
Last time I tried this sort of test, a split write would be observed in
under a second on a true dual processor. However, with only one
processor available, it would typically take around 20 minutes. So you
might have to run a very long test to have any real confidence in the
lack of splitting.
Mark Thornton
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cs.oswego.edu/pipermail/concurrency-interest/attachments/20130430/f6c50b6b/attachment.html>
More information about the Concurrency-interest
mailing list