Volatile与Synchronized分析

并发编程中常见三个问题:原子性、可见性、有序性

处理器为了提高程序运行效率,可能会对输入代码进行优化,这里就不保证程序中各语句执行顺序同代码中顺序一致,但保证程序最终执行结果和代码顺序执行结果是一致的。
这个过程中若指令之间没有数据依赖性,就可能会发生指令重排序。若是单线程不会影响执行结果,并发线程就可能出现错误的数据结果而导致程序异常。

原子性操作,直接将内存中某数值赋值给变量a;而将变量a的值赋值给变量b则非原子性操作——首先从内存中读取变量a的值,接着再将这个值赋给b。这样,若是多线程操作,如a++操作是首先读取a的值,而后进行++的操作。a的值应该是+1了,但是这个时候其值在当前线程的值并不一定会马上写入主内存中,其他线程再来读取a值时候就可能是+1之前的值。不能保证其逻辑的正确性。
若用volatile关键字修饰,则改变后的值会马上写入主内存中,这样即使处于并发线程,也保证了被修饰量的正确性。volatile修饰的变量会禁止指令重排序(有序性)。

每个线程执行过程中都会开辟自己线程的内存空间,从主内存中读取各变量等值到自己线程内存中,而在线程中进行的值的更改并不会马上更新到主内存中,这个时候volatile关键字就保证了被修饰的变量的值及时更新到主存中。synchronized则是同步锁,保证被修饰代码块等的同步,但是在时效上可能会有耗时等缺点(若其修饰部分未执行完毕就会造成阻塞)。

二者比较:
①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法
②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。
synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值