Is this class thread-safe?
Is it possible to see inconsistent values? Lets say initially a's value is 80. Thread 1 calls setA(100)
and enters the function but did not yet call a.set(100)
and Thread 2 concurrently calls getA()
. Is it possible for Thread 2 to see 80?
public class A {
private AtomicInteger a;
public int getA() {
return a.get()
}
public void setA(int newVal){
a.set(newVal);
}
}
I know that synchronizing it will guarantee thread 2 sees 100, but not sure with AtomicInteger.
Is this class thread-safe?
Yes it is.
Thread 1 calls setA(100) and enters the function but did not yet call a.set(100) and Thread 2 concurrently calls getA(). Is it possible for Thread 2 to see 80?
Yes. Until the memory barrier code that synchronizes the volatile field inside of AtomicInteger
completes, the race condition can show 80 or 100.
Thread 1 could even enter the AtomicInteger.set
method and be before the inner field assignment and still the 80 may be returned by get AtomicInteger.get
method.
There are no guarantees about when the values will be updated in other threads. What is guaranteed is when the get()
completes, you get the most recent synchronized value and when the set()
completes, all other threads will see the updates.
There is no guarantee as to the timing of getter and setter calls in different threads.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With