线程安全的理论讲解(volatile)

 参考:http://blog.csdn.net/xieyuooo/article/details/8639190

在J U C里面,要谈到并发,就必然就存在可见性问题,其实对于程序来讲,要说到锁,首先要确保可见性,也就是要在这个基础上才能做到,而CAS也是基于这种原理来完成,我们在文章:Java JUC之Atomic系列12大类实例讲解和原理分解 中关于Atomic的介绍中有提到通过unsafe调用底层的compareAndSwapXXX的三个方法,都是基于可见性变量才会有效。

谈到可见性,首先要明白一下内存和CPU以及多个CPU之间数据修改的基本原理,我们不要谈及CPU上太深的东西,我只需要明白,要将数据进行运算,就需要将数据拷贝到CPU上面去计算,那么就会有内存和CPU之间的通信、CPU的计算、写回到内存一些动作,此时基于线程的私有栈中会保存这些数据;而可见性会体现在:当另一线程对共享数据进行修改的时候,另一个线程未必能看到或者未必能马上看到这个数据。那什么叫看到这个数据呢?说起来蛮抽象的,并且这些情况通常不好模拟,在不同的CPU下也会模拟出来不同的效果或者根本模拟不出来(所以本文只会给出很多理论,因为给你的代码你可能会认为他们是无法将场景实现的),我们下面用简短的一段例子描述下大概:

当一个线程创建多个子线程去做很多任务的时候,在每个子线程内部的都有一个状态区域设置(例如:初始化、运行中、执行完成、执行失败等),主线程会不断去读取子线程的状态,从而做进一步的操作;上面所提到的可见性就是体现在当主线程去读取子线程的数据的时候,有可能会导致数据的还是“老”的值或“失效”的值的情况,但是并不是任何时候都出现,只是一些偶然的情况会发生,由于某些CPU的优化或当JVM被调节为-server模式下运行时,允许很多信息被优化后才会发生;所以你经常在本地调试一些并发程序发生没有什么问题,当你发布到server下后,经常会出现一些稀奇古怪的问题,这是为什么呢,程序的优化和CPU的优化,它认为这里应该是安全的,可以被优化或转换,如果你不想让他变化,你就需要告诉他们,你的数据是存在多线程安全隐患的。

文章中会介绍很多关于线程安全的知识理论分享,也许你第一遍看下来头晕脑胀,但是通过理解后再看看,也许你就会有很多自己的理解,从而在多线程编程时对于线程的安全有新的认识。


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值