并发编程和volatile

一.并发编程的三个概念

1.原子性:就是一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素,要么就都不执行

2.可见性:指多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值

3.有序性:即程序执行的顺序按照代码的先后顺序执行

处理器为了提高程序运行效率,可能会对输入代码进行优化,即不保证代码的执行顺序和代码的顺序一致,但会保证结果与顺序执行的结果一致。。。。。。。当然你无序对单线程的程序是没影响的,但是会对多线程的情况下的有影响

多线程影响:

 
  1. context = loadContext(); //语句1

  2. inited = true; //语句2

  3.  
  4. //线程2:

  5. while(!inited ){

  6. sleep()

  7. }

  8. doSomethingwithconfig(context);

   上面代码中,由于语句1和语句2没有数据依赖性,因此可能会被重排序。假如发生了重排序,在线程1执行过程中先执行语句2,而此是线程2会以为初始化工作已经完成,那么就会跳出while循环,去执行doSomethingwithconfig(context)方法,而此时context并没有被初始化,就会导致程序出错。

二:java的内存模型

目的是为了屏蔽各个硬件平台和操作系统的内存访问差异

  Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。

java内存模型对那三个属性是怎么定义的呢

1.原子性

java中对基本类型的变量的读取和赋值是原子类型的操作(不是很好理解)

  • x = 10; //语句1

  • y = x; //语句2

  • x++; //语句3

  • x = x + 1; //语句4

这四个操作只有第一个是原子操作,剩下三个操作其实都可以分为两个操作,首先先去读取x的值,然后再去操作

就是一个或者几个操作在一个线程执行完成之后别的线程才能来操作。也就是这些操作是不可分割的

2.可见性

  对于可见性,java采用volatile来保证,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。。。当然也可以采用synchronized和Lock来保证

3.有序性

可通过violate来保证,也可以通过synchronized和Lock来保证

三:正式介绍violatile

他有两层含义

1.保证可见性

2.进制进行指令重排序

但是他不保证原子性

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值