谈谈volatile的作用

volatile 的作用不可小觑 这个在高并发的开发中起到不可忽视的作用 首先谈谈 我们对高并发开发中的多线程应用注意事项
1.原子性 可见性 顺序性
在多线程中 原子性是指当我们多个线程进行访问一个共享内存的时候 一起修改同一个共享内存情况下 要么这个变量一次改变完成 这个过程不会被打断 如果在业务逻辑中 被打断了就回滚 要么成功 要么失败 都是一个线程单独的操作完整的处理过程
可见性是只 在多个线程中 一旦我修改了原始地址内存的变量 那么这个变量就会同时作用到其他线程 这个前提是变量用volatile修饰 这样的话 这个变量访问的时候 总是重新从原始地址进行读取 而不会读取寄存器内部的 因为计算机为了快速 设定了寄存器 所以我们重复读取同一个变量的时候 会读取第一次进入的寄存器里面的数据 所以有的时候我们原始地址的内容改变了 其他线程也不可见 导致数据操控混乱 和读脏数据 差不多
顺序性是指 我们的IDE 编译器 经常会优化cpu对这个程序的指令顺序 比如int i=1; int b=i; b=1; i=3 ; 这种情况 我们计算机并不是顺序执行 往往是会按照随机顺序执行 但是当b变量依赖于i的时候 这种情况 处理器的顺序肯定是先执行第一行 然后第二行
为什么会编译器优化呢 就是为了让我们的程序代码的每一行都有其生存的价值 而不是直接int i=1; i=2 ; i=3 ;最后编译器实际执行的只有i=3; 所以我们经常用volatile 修饰某一个指针 或者变量 用于硬件设备驱动程序内部
硬件的优化 :是在cpu和主存之间加入cache 为了兼容主存和cpu速率不一致的特性
如void demo(volatile int ptr)
{
return ptr**ptr;这种情况下真的是返回了ptr指向的内存数据的平方么 答案是不是的 因为如果多线程情况下 ptr指向的数据每次访问都会访问到原始地址内存 所以可能在计算过程中第二个ptr数据改变 这样导致了 计算错误 比如我1
1 但是突然1*3了 这种情况就是导致了 volatile的一些缺陷 合理应用 在多线程中
}
解决办法是 void demo(volatile int *ptr)
{
int a=ptr;
return a
a;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值