栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

synchronized与volatile

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

synchronized与volatile

synchronized与volatile

synchronized:同步(synchronization)就是指一个线程访问数据时,其它线程不得对同一个数据进行访问,即同一时刻只能有一个线程访问该数据,当这一线程访问结束时其它线程才能对这它进行访问。

可见性

synchronization的两条规定:

  1. 线程解锁前,必须把共享变量的最新值刷新到主内存

  2. 线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值。

原子性:

由于synchronized能够保证任一时刻只有一个线程执行,那么自然就不存在原子性问题了,从而保证了原子性。

volatile:

可见性

volatile的两条规定:
1.volatile变量每次被线程访问时,都强迫从主内存中读取该变量的值。
2.当变量发生变化的时候都会强迫线程将最新的值刷新到主内存中。
这样不同的变量总能看到最新的值。能够保证volatile变量的可见性
不足:一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。

原子性

只能保证单个volatile变量的原子性,对于volatile++这种复合操作不具有原子性

synchronized和volatile的比较

  1. synchronized锁住的是变量和变量的操作,而volatile锁住的只是变量,而且该变量的值不能依赖它本身的值。
  2. volatile算是一种轻量级的同步锁,volatile不需要加锁,比synchronized更加轻量级,不会阻塞线程。
  3. synchronized既能保证可见性,又能保证原子性,而volatile只能保证可见性,无法保证原子性。

注:由于voaltile比synchronized更加轻量级,所以执行的效率肯定是比synchroized更高。在可以保证原子性操作时,可以尽量的选择使用volatile。在其他不能保证其操作的原子性时,再去考虑使用synchronized。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/349416.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号