For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
并发编程开发应该是每一位Java程序员都需要熟练掌握和应用的一种编程开发方式,今天我们就通过案例分析来简单了解一下,并发编程开发底层运行原理。
每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是否过期了,当处理器发现自己缓存行对应的内存地址被修改,
就会将当前处理器的缓存行设置为无效状态,当处理器对这个数据进行修改操作时,会重新从系统内存中把数据读到处理器缓存里。
1、volatile可见性的实现原理
有volatile修饰的共享变量进行写操作时,jvm就会向处理器发送一条Lock前缀指令,该操作会引起处理器缓存回写到内存,
另外,一个处理器的缓存回写到内存会导致其他处理器的缓存无效,需要从内存读取数据。
2、synchronized实现原理与应用
Java中每一个对象都可以作为锁。
对于普通同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前类的Class对象。
对应同步方法块,锁是synchronized括号里配置的对象。
从JVM规范中可以看到synchronized在JVM里的实现原理,JVM基于进入和退出Monitor对象来实现方法同步和代码块同步。
代码块同步是使用Monitorenter和monitorexit指令实现的,而方法同步是使用另外一种方式实现的。
3、什么是锁,锁存在哪里?
synchronized用的锁是存在Java对象头里的,名叫MarkWork,具体结构可参阅书籍。
4、锁的四种状态及转换:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态
锁的级别会随着竞争而升级,但是不会降级,目的都是为了提高获取锁和释放锁的效率。
5、CAS实现原子操作的三大问题
Ⅰ、ABA问题:假如一个数据原来是A,变成了B,又变成了A。
ABA问题的解决思路是使用版本号,每次变量更新时把版本号加一。
从Java1.5开始,JDK的Atomic包里提供了一个类AtomicStampedReferenc来解决ABA问题,解决思路就是使用版本号。
Ⅱ、循环时间长开销大。
自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。如果JVM能支持处理器提高的pause指令,那么效率会有一定提升。
Ⅲ、只能保证一个共享变量的原子操作
从Java1.5开始,JDK提供了AtomicReference类来保证引用对象之间的原子性,可以把多个变量放在一个对象里进行CAS操作。
6、除了偏向锁,JVM实现锁的方式都用了循环CAS
即当一个线程想进入同步块的时候使用循环CAS的方式来获取锁,当他退出同步块时使用循环CAS释放锁。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。