On 2007-01-31, Knute Johnson <> wrote:
> Thanks very much for your response. The two actions are independent and
> I do not want to effect when they occur. I just want to ensure that if
> an assignment is made to the variable that any subsequent read in the
> other thread will have the latest value.
Without any other sychronization action between the threads, the only
way you know that a read was subsequent to a write is based on the value
that was read. A read is subsequent to a write that wrote the value
that was read.
The fact that the variable is volatile means that reads and writes by
a thread cannot be reordered to be before the previous synchronization
action or after the next synchronization action. According to section
"8.3.1.4 volatile Fields" of the JLS (from
http://java.sun.com/docs/books/jls/t...es.html#36930),
given the class
class Test {
static volatile int i = 0, j = 0;
static void one() { i++; j++; }
static void two() {
System.out.println("i=" + i + " j=" + j);
}
}
If method one() is repeatedly called by one thread and method two() is
repeatedly called by another thread, then according to the JLS:
Therefore, the shared value for j is never greater than that for i,
because each update to i must be reflected in the shared value for i
before the update to j occurs.
If the variables i and j were not volatile, then lines printed by method
two() may have a value of j greater than that of i.