2017-08-17 27 views
-4

假设你有:volatile boolean called = false;这是 - >如果(!称为&&(叫=真)){...做一次...}一个原子操作?

volatile boolean called = false; 

这是

if (!called && (called = true)) { ... do once ... } 

一个原子操作?

我知道关于AtomicBoolean。问题不在于如此,所以试图抵制你的冲动。

+4

不,不是。怎么会这样?你在这里显然有两个部分:1读取被调用的当前值并且如果它是假的,则进行测试; 2.分配true。 –

+2

简答:“不,这不是原子操作”。 –

+0

我很想投票结束重复到https://stackoverflow.com/questions/4876122/when-is-it-preferable-to-use-volatile-boolean-in-java-rather-than-atomicboolean? rq = 1 –

回答

2

在一个天真的实现,这可能归结为:

LOAD A ; called 
    NEG  ; negate 
    BRF 1$ ; branch if false 
    LOAD 1 ; true 
    STOR A ; store into called 
1$:   ; do once 

不完全是原子,是吗? Java编译器可能会将NEG/BRF序列更改为BRT(如果为true,则为分支),但是这可以帮助您尽可能合理地预期。

奇怪的问题。

+0

嗯,我想一个更好的措辞可能是说,它是同步安全的(ifblock的内容),我认为这是因为我发现它很难另一个线程可以介于两者之间,而同一条命令是仍在执行中。 请注意,通过发现它很难,我真的认为不可能像java的并发包中的经验一样,它看起来类似于一个衬垫经常被用作避免竞争条件的保证。 – momomo

+1

@momomo感受和猜测不是你如何编写在并发访问下行为正常的代码。如果您认为您已经在Java中看到类似这样的代码,那么请提供链接。上下文很重要。 –

+0

我不是猜测,我试图找出答案。是否有任何情况下if块可以执行两次?我比实际使用它更感兴趣。 – momomo

相关问题