volatile关键字

volatile关键字

volatile 意思是 : 多线程操作时保持即时可见

话要从java的多线程模型说起:
java多线程内存模型
图片表达的非常清晰,线程直接操作的变量等来自工作内存,工作内存里保存着这个线程所要用到的所有变量,这些变量是从主内存里coppy出来的,两个线程之间的变量操作需要通过主内存来进行.
这样会造成多个线程执行同一段代码时会出问题,造成数据的”脏读”问题;
假如代码如下 :

i++;

假设此时i为10,如果有两个线程同时操作 i++ 这行代码,按照一般的想法,结果应该是为12;结果有可能是11,当线程A执行完10+1之后数据还未写入到主内存中,而此时线程B从主内存中copp出来的i的值仍然为10,所以最后的结果仍然为11;

所以如果i的值的变化对于其他的线程是即时可见的话,就会避免这个问题,所以如果我们在定义变量i的时候加上volatile这个修饰的话,当线程A执行完10+1之后会马上把i的值写入到主内存中,当线程B想要执行i++代码时,会重新去主内存拉取变量值,这样的结果就是12;

java并发编程的三大概念

java并发编程的三大概念重要的有三种: 原子性,可见性,有序性;
其实上面的volatile是Java多并发编程中的一种 : 可见性.
下面我们一一道来 :
1.原子性:一个操作或者多个要做如果不能保证执行的过程无法被打断那么就不执行;
比较著名的问题是银行转账,A往B里转1000,分两步A扣1000,B加1000.如果在A扣完1000,操作突然中止了,,A钱少了,B没增加.
在java中,对基本数据类型的变量的读取和赋值操作是原子性操作;
例如 i++,分三步,读取i的值,执行+1操作,重新给i赋值.虽然读取和赋值都是原子性操作但是合在一起并不是.所以如果要实现更大范围操作的原子性,可以通过synchronizedLock来实现。由于synchronized和Lock能够保证任一时刻只有一个线程执行该代码块,那么自然就不存在原子性问题了,从而保证了原子性
2.可见性:多个线程访问同一个变量,其中一个修改了值剩下的所有的线程都能看到.
其实就是volatile所讲的那些.
3.有序性即程序执行的顺序按照代码的先后顺序执行.
其中会涉及到: 指令重排序.这个以后再讲.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值