These are java constructs, so you will not see them anywhere in the clojure documentation other than "do not use this."
Reads and writes are atomic for all variables declared "volatile".
Unsynchronized fields are ordinary Java variable variables.
See https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html
In practical terms, this means that if you have a data structure, when multiple threads access data to read or write volatile targets will always be consistent; that is, you will always receive a data object that is either completely or completely after the operation on this data.
Sorry if this does not mean 100%; semantics are complex; read about it if you want a deeper understanding: When do you use the volatile keyword in Java?
TL; DR;
Volatiles are slightly less effective than unsynchronized; but it gives better data transfer guarantees.
Avoid both of them if you can, but if you need to use them, you probably want to :volatile-mutable
source share