Java Reference
In-Depth Information
Synchronization actions induce the
synchronized-with
relation on actions, defined as fol-
lows:
• An unlock action on monitor
m synchronizes-with
all subsequent lock actions on
m
(where “subsequent” is defined according to the synchronization order).
• A write to a volatile variable
v
(§
8.3.1.4
)
synchronizes-with
all subsequent reads of
v
by any thread (where “subsequent” is defined according to the synchronization
order).
• An action that starts a thread
synchronizes-with
the first action in the thread it
starts.
• The write of the default value (zero,
false
, or
null
) to each variable
synchronizes-
with
the first action in every thread.
Although it may seem a little strange to write a default value to a variable be-
fore the object containing the variable is allocated, conceptually every object
is created at the start of the program with its default initialized values.
• The final action in a thread
T1 synchronizes-with
any action in another thread
T2
that detects that
T1
has terminated.
T2
may accomplish this by calling
T1
.isAlive()
or
T1
.join()
.
• If thread
T1
interrupts thread
T2
, the interrupt by
T1 synchronizes-with
any point
where any other thread (including
T2
) determines that
T2
has been interrupted (by
having an
InterruptedException
thrown or by invoking
Thread.interrupted
or
Thread.isInterrupted
).
The source of a
synchronizes-with
edge is called a
release
, and the destination is called an
acquire
.
17.4.5. Happens-before Order
Two actions can be ordered by a
happens-before
relationship. If one action
happens-before
another, then the first is visible to and ordered before the second.
If we have two actions
x
and
y
, we write
hb(x, y)
to indicate that
x happens-before y
.
• If
x
and
y
are actions of the same thread and
x
comes before
y
in program order,
then
hb(x, y)
.
• There is a
happens-before
edge from the end of a constructor of an object to the
• If an action
x synchronizes-with
a following action
y
, then we also have
hb(x, y)
.