volatile不能保证程序执行的原子性以及只能一定程度上保证有序性
2017-03-21 14:07
281 查看
多线程并发编程如何正确的执行程序:
1、原子性:执行过程要么成功要么失败,比如经典的银行转账问题。
2、可见性:多线程并发时,一个线程修改了工作内存中的值(主存中的值),会立刻改变主存相应地址的值,其它线程工作内存的值无效,重新获取主存的值。
3、有序性:程序执行的顺序,单个线程中没有依赖的代码,cpu会进行指令重排,使代码执行顺序调换,但是不影响最终执行的结果(单线程没有任何问题,多线程就会出现问题)
总结:解决多线程并发问题,需要程序满足上面三个条件才能正确执行。
volatile能保证第二点可见性。
volatile能禁止指令重排序(所以volatile能在一定程度上保证有序性),但是这里只能保证volatile所修饰的变量之前的程序不会在该变量之后执行,该变量之后的代码不会在变量之前执行。
1、原子性:执行过程要么成功要么失败,比如经典的银行转账问题。
2、可见性:多线程并发时,一个线程修改了工作内存中的值(主存中的值),会立刻改变主存相应地址的值,其它线程工作内存的值无效,重新获取主存的值。
3、有序性:程序执行的顺序,单个线程中没有依赖的代码,cpu会进行指令重排,使代码执行顺序调换,但是不影响最终执行的结果(单线程没有任何问题,多线程就会出现问题)
总结:解决多线程并发问题,需要程序满足上面三个条件才能正确执行。
volatile能保证第二点可见性。
volatile能禁止指令重排序(所以volatile能在一定程度上保证有序性),但是这里只能保证volatile所修饰的变量之前的程序不会在该变量之后执行,该变量之后的代码不会在变量之前执行。
相关文章推荐
- volatile不能保证程序执行的原子性以及只能一定程度上保证有序性
- 现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。
- unity3d发布PC端后的exe程序,怎么保证只能开一个实例,不能多开?
- umeng(源生微信SDK)分享以及登陆的一些坑(只执行onStart不执行onComplete;分享内容只有图片;只能分享朋友圈,不能分享朋友)
- VC中利用管道技术取得DOS或者命令行以及外部程序的执行结果
- 封装了envi函数的IDL发布程序的执行方法 以及注意事项
- 该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。新事务不能登记到指定的事务处理器中。
- .Net中如何限制执行程序只能运行一次和如何读写注册表
- C#中利用process类调用外部程序以及执行dos命令 - ASP.NET
- 【原创】进程操作:程序只能由特定进程打开,不能单独双击运行的比较笨的解决办法
- VC中利用管道技术取得DOS或者命令行以及外部程序的执行结果
- 控制一个 Java 程序运行生命周期结束前不能再次被执行
- 如何使PC上运行的程序不能退出,并且用户只能使用当前正在运行的程序。不能使用PC上的其他程序
- 各式各样的自启动(系统启动或注销及开机\关机时执行一定程序)
- 各式各样的自启动(系统启动或注销及开机\关机时执行一定程序)
- C#中利用Process类调用外部程序以及执行dos命令(转)
- 程序换了虚拟影射盘后不能执行,数据都是一样的
- 改注册表,在一定时间内只能运行指定程序,知道用组策略管理器,可以实现,不过我想用编程的方法。
- C#中利用process类调用外部程序以及执行dos命令
- 《.NET框架程序设计》读书笔记一--.NET程序的生成以及执行过程