Volatile means visibility but sometimes people confuse it with atomicity.
Consider the following code:
So is the above code thread-safe?
The answer to this lies on 2 things -
So, if Threads 1 and 2 both read v and see the value 0, then Thread 1 will write 1 to it and Thread 2 will write -1 to it. You are not guaranteed to see the value 0!
So to make above code thread-safe, you should use java.util.concurrent.atomic classes, which allows to create object and allow atomic increment and decrement with support from hardware or processor level.
Consider the following code:
volatile int i = 0; //Thread 1: i++; //Thread 2: i--;
So is the above code thread-safe?
The answer to this lies on 2 things -
i++ and i--
are not atomic operations. See here for atomic operations. Read the integer to local, increment local and write back integer to the volatile field i.
- volatile only guarantees visibility between the threads
//Thread 1:r1,r2 local values r1 = i; r2 = r1 + 1; i = r2; //Thread 2: r3 = i; r4 = r3 - 1; i = r4;
So to make above code thread-safe, you should use java.util.concurrent.atomic classes, which allows to create object and allow atomic increment and decrement with support from hardware or processor level.
No comments:
Post a Comment