volatile与synchronized区别

volatile关键字:

volatile可用于修饰变量,可以保证变量的可见性,但不保证原子性。

对volatile修饰的变量进行“写”操作后,会执行store指令将线程内存最新数据写到主存上;

对volatile修饰的变量进行“读”操作前,会执行load指令将主存最新数据写到线程内存上。

因volatile不对对象加锁,所以并发线程可同时取到变量,导致变量的原子性被破坏。

若要保证原子性,可以通过ReentrankLock手工加锁,或者选用Atomic变量,如:AtomicInteger来保证。

synchronized关键字:

synchronized可用于修饰方法、代码块、类,可以同时保证可见性与原子性。

对象被synchronized修饰,线程会获取此对象的对象锁。

在读取变量前,此线程内存变量会失效,需要从主存重新读取;

在释放锁后,会同步刷新主存中的相关变量。

synchronized通过锁来保证原子性,通过重新取值保证可见性。

你可能感兴趣的:(volatile与synchronized区别)