关键字volatile与关键字synchronized
2015-11-24 21:30
162 查看
关键字volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。使用关键字volatile增加了实例变量在多个线程之间的可见性。但是volatile关键字最致命的缺点是不支持原子性。
下面将关键字volatile和synchronized进行比较:
1)关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字在执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。
2)多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。
3)volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公共内存中的数据做同步。
4)关键字volatile解决的是变量在多个线程之间的可见性;而synchronized关键字解决的多个线程之间访问资源的同步性。
线程安全包含原子性和可见性两个方面,java的同步机制都是围绕这两个方面来确保线程安全的。
关键字volatile主要使用的场合是在多个线程中可以感知实例变量被更改了,并且可以获得最新的值使用,也就是用多线程读取变量时可以获得最新值使用。
关键字volatile提示线程每次从共享内存中读取变量,而不是从私有内存中读取,这样就保证了同步数据的可见性。
关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法或某一个代码块。它包含两个特征:互斥性和可见性。同步synchronized不仅可以解决一个线程看到对象处于不一致的状态,还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护之前所有的修改效果。
下面将关键字volatile和synchronized进行比较:
1)关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字在执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。
2)多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。
3)volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公共内存中的数据做同步。
4)关键字volatile解决的是变量在多个线程之间的可见性;而synchronized关键字解决的多个线程之间访问资源的同步性。
线程安全包含原子性和可见性两个方面,java的同步机制都是围绕这两个方面来确保线程安全的。
关键字volatile主要使用的场合是在多个线程中可以感知实例变量被更改了,并且可以获得最新的值使用,也就是用多线程读取变量时可以获得最新值使用。
关键字volatile提示线程每次从共享内存中读取变量,而不是从私有内存中读取,这样就保证了同步数据的可见性。
关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法或某一个代码块。它包含两个特征:互斥性和可见性。同步synchronized不仅可以解决一个线程看到对象处于不一致的状态,还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护之前所有的修改效果。
相关文章推荐
- 关联原理说明
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- 自定义相机添加闪光灯设置
- Switch Game
- ARM64的启动过程之(六):异常向量表的设定
- Can't install RMagick 2.15.4. Can't find Magick-config or pkg-config in /usr/local/sbin:/usr/local/b
- 2015 CCPC Secrete Master Plan
- 1081. Rational Sum
- Struts2中的ModelDriven机制及其运用
- 中文Ubuntu系统根目录文件夹名称变为英文
- Linux下Vsftp配置及详解
- vijos--P1211--生日日数(纯模拟)
- 没有躲过的坑--类中的静态成员变量(static or const static)
- SQL server 变量、运算符
- 没有躲过的坑--类中的静态成员变量(static or const static)
- codeforce #320E Weakness and Poorness (三分)
- error MSB4018 “CL”任务意外失败
- Kendo UI的datasource批量更新的扩展方法
- vijos--P1211--生日日数(纯模拟)