java volatile关键字与并发三大特性,总结

并发三大特性

原子性

有序性

程序执行的顺序按照代码的先后顺序执行
编译器和处理器为了提高执行的效率性能描绘对执行进行重排序,指令重排序对单线程没有影响,但是在多线程环境下可能会出现问题。

如何保证有序性

1、synchronized
2、lock
3、volatile(一定程度的有序性)
synchronized和lock在同一时刻只能让一个线程执行同步风法,但让是有序的了
volatile的有序性是指写入修改后的volatile变量这个操作必定优先于读取这个变量。

可见性

当多线程访问同一个变量的时候,一个线程修改了一个变量的值,其他线程可以马上读取到修改后的值

如何保证可见性

1、Lock
2、synchronized
3、原子类
4、volatile

volatile关键字的意思是不稳定的,可变的

使用volatile关键字和不使用的区别在于JVM内存主存和线程工作内存的同步之上,volatile保证变量在线程工作内存和主存之间一致,其实就是告诉处理器,不要将我放进工作内存,请直接在主存操作我。

多线程操作的时候不是为了保护线程安全,而是为了保护线程的变量不会被主函数或中断函数反复修改造成错误;

结合java的内存模型,volatile修饰的变量只会在主存里面操作,不会放入线程内存中,在主存里面操作的东西,一旦修改,所有的线程马上就可以看得见。

同时也要注意,在多线程中,如果使用++这种,是不可以保证变量,因为++涉及到取值、运算、赋值的操作,不是原子性操作。

volatile只能保证读写一致性,不能保证一致性

为何volatile能保证有序性、可见性呢?

volatile相当于轻量级锁
1.与锁不同的是,volatile不具有排他性,也不会导致上下文切换
2.与锁相同的是JVM实现volatile的有序性和可见性的保证也是借助《内存屏障》

volatile变量的写操作相当与释放锁,读操作相当于获得锁,JVM通过volatile变量写之前插入释放屏障,在读之后插入获取屏障,这样成对的屏障就保证了volatile的有序性。
同样的JVM在volatile变量写操作之后插入存储屏障,在读操作之前插入加载屏障,保证了volatile变量的可见性。

参考:
https://www.cnblogs.com/prctice/p/4434968.html
https://www.cnblogs.com/alenblue/p/13292576.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值