java线程安全

为什么存在线程不安全?
由于
java内存模型:
所有的变量都储存在主内存之中。(局部变量是一个reference类型,其是线程私有,它引用的对象是在主内存中的,被各个线程共享的//自己的思考:如果这个对象的引用,仅有此处有,也就相当于此对象线程私有,因为对对象的访问只能通过引用啊。)
线程只能对工作内存操作,并不能直接对主内存操作(线程的工作内存中保存了被该线程使用变量的主内存的拷贝(拷贝的是基本类型和引用)),可能两个线程一起干事(Aa=a+100,
B:a=a-50),但是由于是并发执行,所以存在问题。各自拷贝的是最初的值,各自计算,最后将工作内存的值更新到主内存中,存在其中一个更新覆盖了另外一个更新。所有A和B所干的事需要保证原子性,就是保证每一次操作的值都是最新的值。volatile变量的作用在于保证可见性(即,对变量的修改可以立即被其他线程得知,实现的原理是:通过获得JIT的反汇编代码(随着高性能虚拟机真正的实现细节与虚拟机规范差距越来越大,虚拟机规范越来越成为了概念模型,分析虚拟机执行语义的行为(虚拟机做了什么),可以在字节码上分析,分析程序的执行行为(虚拟机是怎么样做的,性能如何,所以我们需要JIT反汇编))可以得知volaile是通过在变量修改之后添加lock 指令,查看ia32手册,是将cpu cache写入内存,也会让其他cpu的cache的该变量无效化,因此,所以其他线程需要重新读取该变量,保证该变量最新,还能保证一定的有序性),但是由于只是保证线程内存中的值是最新值,所有还是不能保存a=a+10也是原子的。因为该变量会拷贝到操作数栈进行操作,所以必须用sychronized将a=a+100框起来,保证这个过程不被其他线程打断。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值