I know that compound operations such as i++
are not thread safe as they involve multiple operations.
But is checking the reference with itself a t
No, a != a
is not thread safe. This expression consists of three parts: load a
, load a
again, and perform !=
. It is possible for another thread to gain the intrinsic lock on a
's parent and change the value of a
in between the 2 load operations.
Another factor though is whether a
is local. If a
is local then no other threads should have access to it and therefore should be thread safe.
void method () {
int a = 0;
System.out.println(a != a);
}
should also always print false
.
Declaring a
as volatile
would not solve the problem for if a
is static
or instance. The problem is not that threads have different values of a
, but that one thread loads a
twice with different values. It may actually make the case less thread-safe.. If a
isn't volatile
then a
may be cached and a change in another thread won't affect the cached value.
Proved with test-ng:
public class MyTest {
private static Integer count=1;
@Test(threadPoolSize = 1000, invocationCount=10000)
public void test(){
count = new Integer(new Random().nextInt());
Assert.assertFalse(count != count);
}
}
I have 2 fails on 10 000 invocations. So NO, it is NOT thread safe