volatile与synchronized区别

volatile关键字:

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

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

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

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

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

synchronized关键字:

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

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容