volatile关键字:
volatile可用于修饰变量,可以保证变量的可见性,但不保证原子性。
对volatile修饰的变量进行“写”操作后,会执行store指令将线程内存最新数据写到主存上;
对volatile修饰的变量进行“读”操作前,会执行load指令将主存最新数据写到线程内存上。
因volatile不对对象加锁,所以并发线程可同时取到变量,导致变量的原子性被破坏。
若要保证原子性,可以通过ReentrankLock手工加锁,或者选用Atomic变量,如:AtomicInteger来保证。
synchronized关键字:
synchronized可用于修饰方法、代码块、类,可以同时保证可见性与原子性。
对象被synchronized修饰,线程会获取此对象的对象锁。
在读取变量前,此线程内存变量会失效,需要从主存重新读取;
在释放锁后,会同步刷新主存中的相关变量。
synchronized通过锁来保证原子性,通过重新取值保证可见性。