本文由“全村的希望”读者投稿。
这个问题可以从Java内存模型方面来回答,Java内存模型主要是围绕在并发过程中如何处理原子性,可见性,有序性这三个特征来建立的。
volatile关键字可以保证线程间变量的可见性,还有包含了禁止指令重排序的语义,满足了有序性。
synchronized关键字原子性(排它锁),可见性,有序性都可以满足。因此它们的区别就在于原子性了。
PS:
上述特性可以从先行发生happens-before原则在来解释一下。先行发生是Java内存模型中定义的两项操作的偏序关系。第三条,volatile变量规则:对一个volatile变量的写操作先行发生于读操作,满足可见性。第二条,管程锁定原则:一个unlock先行发生于后面同一个锁的lock,满足有序性。