Then one or more threads set the flag
(but not clear it). If I have one
thread that reads the flag, and if
set, does an action, and then clears
the flag, is volatile adequate?
Yes, if you don't need the special abilities of AtomicBoolean, it's perfectly fine to use volatile for this. In fact, this is one of the few reasonable uses for volatile.