Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!weretis.net!feeder4.news.weretis.net!eternal-september.org!feeder.eternal-september.org!mx04.eternal-september.org!.POSTED!not-for-mail From: Knute Johnson Newsgroups: comp.lang.java.programmer Subject: Re: Volatile happens before question Date: Tue, 17 Jan 2012 09:21:17 -0800 Organization: A noiseless patient Spider Lines: 46 Message-ID: References: <09848313-2372-4c23-8f52-fa84c612c100@u32g2000yqe.googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Tue, 17 Jan 2012 17:21:17 +0000 (UTC) Injection-Info: mx04.eternal-september.org; posting-host="mz/LDSJwiWnk3Jnnqg7x+Q"; logging-data="14699"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+jm/Nbolp3GkgpONlzkVDd" User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:9.0) Gecko/20111222 Thunderbird/9.0.1 In-Reply-To: Cancel-Lock: sha1:fmdT7TklIdICAHiQ7sALHs3z4Qw= Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:11410 On 1/17/2012 8:49 AM, Knute Johnson wrote: > On 1/17/2012 8:33 AM, markspace wrote: >> On 1/17/2012 8:18 AM, Knute Johnson wrote: >> >>>> Does this work in reverse too? >>>> >>>> For example, >>>> >>>> Thread 1 >>>> int b = 0; >>>> volatile boolean a = false; >>>> ... >>>> ... >>>> a = true; >>>> b = 1; >>>> >>>> Thread 2 >>>> int bStore = b; >>>> if (!a) { >>>> System.out.println("The value of b is " + bStore); >>>> } >>>> >>>> Will this always print either "The value of b is 0" or nothing. >>> >>> Yes >> >> >> I'm pretty sure Peter got the correct answer which is "no." I want to >> stick my answers in a separate reply, so I'll just add that this is an >> easy mistake to make and if both Peter and you hadn't already provided >> some insights I probably would have flubbed it up myself. >> >> Reasoning about synchronization can be pretty hard. Make sure you >> consider carefully all possibilities when analyzing multi-threaded >> programs for bugs. > > OK, I'll bite, if a is false how can b be anything but 0? > And if b = 1 could be reordered before a = true then b would be flopping all over the place because as soon as a = true b would again have to be 0. -- Knute Johnson