Hi,

There is one more tricky issue here if the variable is not volatile,
which can cause a problem on any architecture: If the compiler
determines that the code inside the loop will never modify isRunning,
then it might "optimize" the exit condition into just while(true).

And this can actually happen:
http://stackoverflow.com/questions/25425130/loop-doesnt-see-changed-value-without-a-print-statement

Gabor


2015-06-22 17:13 GMT+02:00 Stephan Ewen <se...@apache.org>:
> The run() and cancel() methods are definitely called by different flags.
>
> On most architectures, it would not make much difference whether the field
> is volatile or not, because non.volatile field values propagate into other
> caches fast as well. Guarantees about "happens before" are also not needed
> here.
>
> On Tue, Jun 16, 2015 at 4:08 PM, Aljoscha Krettek <aljos...@apache.org>
> wrote:
>
>> But the sources stay inside they run() method the whole execution time, per
>> design. That's why another thread needs to call cancel() on the source to
>> break it out of this (in most cases) infinite loop.
>>
>> On Tue, 16 Jun 2015 at 14:13 Matthias J. Sax <
>> mj...@informatik.hu-berlin.de>
>> wrote:
>>
>> > Hi,
>> >
>> > I just encountered, that the (new streaming API) SourceFunction
>> > interface method cancel() states in the JavaDoc, that one might have a
>> > "volatile field 'isRunning'". Why should this member be volatile? I do
>> > not see why different thread should access this field (I would claim, it
>> > will be implemented as a private/protected member variable), and thus,
>> > declaring it volatile should not be necessary.
>> >
>> > Do I miss anything?
>> >
>> > -Matthias
>> >
>> >
>>

Reply via email to