- all assignments of primitive types except for long and double
- all assignments of references
- all assignments of volatile variables
- all operations of java.concurrent.Atomic* classes
and maybe something more. Look at the jls.
As noted in the comments, atomicity does not imply visibility. So while another thread is guaranteed not to see a partially written int
, it may never see the new value.
The operations on long and double are on common 64 bit CPUs atomic as well, although there’s no guarantee. See also this feature request.