02Java并发编程的艺术之并发机制的底层实现原理

一、volatile的应用

volatile的定义

voliatile主要保证的共享变量的可见性。所谓可见行就是一个线程修改共享变量其他线程都可以看到。volatile是轻量级的synchronized的,比synchronized的执行成本低,不会引起上下文的切换和调度


volatile的实现原理

对于volatile修饰的变量在进行写操作的时候会多一条汇编命令Lock,这条命令主要做两件事情

  • 将当前处理器的缓存行数据写回到系统内存
  • 在写回到系统内存的过程中,把其他处理器的值设置为无效,当其他处理去读取该遍历的时候缓存行的数据是失效的,需要重新区内存当中读取

补充一点,缓存行数据其实就是为提高CPU处理效率,不直接读取内存,而是设置的缓存行,读取缓存行的是数据!



二、Synchronized的实现原理与应用

synchronized的实现原理

JVM通过进入和退出Moniter对象来实现方法的同步和代码块的同步,代码块的同步主要是通过moniterenter和moniterexit来实现的,moniterenter插入到需要同步的代码的开始位置,moniterexit插入到代码的结束和异常的地方,两两的配对!而方法的同步略有差异,JVM规范并没有指出,哈哈哈!


锁的升级与对比

补充一点:JAVA对象头主要记录锁的信息!
锁一共四种状态,分别是无锁状态,偏向锁状态,轻量级锁状态,重量级锁!锁的状态只能升级,不能降级!
偏向锁状态:当一个线程访问同步块的时候,会在对象头和栈帧中记录当前线程的ID,当前线程再来的时候可以直接访问,无需获取锁!
轻量级锁状态:简单的说就是通过CAS的方式把对象头的值改成指向锁记录的指针,改成功就获取到来锁!

个人理解就是当遇到同步代码的时候,如果频繁是一个线程访问的时候,是偏向锁的状态,通过记录线程ID来获取锁;
如果是多个线程,但是线程不多可能升级为轻量级,通过cas方式来获取锁;
如果出现很多个线程争抢,可能升级为来重量锁!排队执行!



三、原子操作的实现原理

什么是原子操作

不可中断的一个或一系列操作就是原子操作!


原子操作的实现原理

原子操作是通过锁或者CAS的方式来保持原子操作的!


原子操作引发的问题

原子操作会引发一下三个问题:

  • ABA问题,ABA就是刚开始变量值是A,后来改成B,再后来又该成A,上面都是同一个线程操作的,当下一个线程准备修改值的时候会认为没有发现变化,会造成修改成功,其实可以通过添加版本号来解决就可以来,比如JDK提供的AtomicStampedReference
  • 自旋时间过长,如果JVM支持处理器提供的pause指令,则可以解决!pause指令主要作用提高执行效率!
  • 只能保证一个共享变量,这个简单,其实可以把多个变量封装成一个对象就可以啦!

感谢大家的阅读,我是Alson_Code,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值