并发 - Java并发机制的底层实现原理

2019-03-04  本文已影响0人  康俊1024

一、概述

Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。

二、几个概念(可见性、顺序性、原子性)

volatile的应用

volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。
原因:由volatile变量修饰的共享变量进行写操作时会出现第二行汇编代码,Lock前缀的指令在多核处理器引发两件事情。
①将当前处理器缓存行(处理器内存)的数据写到系统内存。
②这个写回内存的操作会使其他的CPU里缓存了该内存地址的数据无效。

synchronized的实现原理与应用

synchronized是独占锁也就是是一种悲观锁。Java中的每一个对象都可以作为锁:对于普通同步方法,锁是当前实例对象。对于静态同步方法,锁是当前类的Class对象。对于同步方法块,锁是Synchonized括号里配置的对象。JVM基于进入和退出Monitor对象来实现方法同步和代码块同步。
Java SE1.6中锁一共有四种状态,级别低到高无锁、偏向锁,轻量级锁,重量级锁,能升级不能降级,目的是提高获得锁释放锁的效率。

原子操作的实现原理

原子操作就是一个线程操作从头到尾,不进行线程切换。可以通过锁和循环CAS(compare and swap乐观锁的一种实现机制)的方式来实现原子操作。
JVM中的CAS操作利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止。从Java 1.5开始,JDK的并发包里提供了一些类来支持原子操作,如AtomicBoolean(用原子方式更新的boolean值)、AtomicInteger(用原子方式更新的int值)和AtomicLong(用原子方式更新的long值)。这些原子包装类还提供了有用的工具方法,比如以原子的方式将当前值自增1和自减1。
CAS仍然存在三大问题:
①ABA问题:ABA问题的解决思路就是使用版本号。JDK的Atomic包里提供了一个类AtomicStampedReference来解决ABA问题。
②循环时间长开销大:JVM能支持处理器提供的pause指令,那么效率会有一定的提升。
③只能保证一个共享变量的原子操作:把多个共享变量合并成一个共享变量来操作。JDK提供了AtomicReference类来保证引用对象之间的原子性,就可以把多个变量放在一个对象里来进行CAS操作。

上一篇 下一篇

猜你喜欢

热点阅读