300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Java并发专题二:Java并发机制的底层实现原理

Java并发专题二:Java并发机制的底层实现原理

时间:2021-08-16 12:06:54

相关推荐

Java并发专题二:Java并发机制的底层实现原理

基于《java并发编程的艺术》整理便于以后复习

详细知识点可在书中查阅

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

volatilesynchronizedLock原子操作的实现

volatile

volatile相当于轻量级的synchronized,作用是在多处理器下保证数据的可见性,如果使用得当,会比synchronized的执行成本更低,因为它不会引发线程上下文切换和调度。

volatile修饰的变量就是告知系统,任何对此变量的操作都需要从共享内存中获取,而对他的改变则必须刷新回共享内存中,保证所有线程对共享变量访问的可见性。

volatile的两个实现原则

Lock前缀指令会引起处理器缓存回写到内存,保证缓存的一致性。一个处理器的缓存回写到内存中,会导致其他处理器的内存无效。

synchronized

synchronized在1.6以前是重量级锁的所在,在1.6之后为了减少获得锁和释放锁带来的开销,增加了偏向锁和轻量级锁。

Java中每一个对象都可以作为锁,具体表现是:

普通同步方法是锁当前对象。静态同步方法是锁当前类对象。同步方法块是锁括号内的对象。

synchronized实现与monitor指令有关,monitorenter指令在编译后插入到同步代码块的开始位置,monitorexit指令则插入到方法结束出或者异常处。synchronized用的锁存在于对象头的Mark

Word中。

锁升级和对比

锁四种状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。

锁只能随着竞争升级而升级,但不能降级,目的是为了提高获得锁和释放锁的效率。

1. 偏向锁

偏向锁存在于Java对象头和方法的栈帧中,一个线程访问当前的同步代码块获得锁时,会在对象头和栈帧中记录此线程的ID,这就是偏向锁。

以后此线程访问和退出时,都无需进行CAS操作来加锁和解锁,只需要检测一下Mark Word中的偏向锁是否偏向此线程。

如果测试成功,则不用获得锁;如果测试失败,此线程还需要测试Mark Word中的偏向锁标识是否为1,如果为1,则尝试用CAS将对象头的偏向锁指向当前线程,否则通过CAS竞争锁。

2. 轻量级锁

线程访问同步代码块之前,JVM会先在栈帧中创建用于存储锁记录的空间,并将对象头中的Mark Word复制过去。

然后尝试使用CAS将对象头中的Mark Word替换成指向锁记录的指针。

失败了代表要竞争此资源当前线程会自旋来获取锁

轻量级锁出现在少量线程访问同步代码块并且执行时间比较短,没必要使用重量级锁,自旋获取锁会带来CPU的额外开销。

轻量级锁解锁时,会将之前复制过去的对象头替换回此对象头的Mark Word。如果成功,表示没有竞争;失败了锁就会变成重量级锁。

3. 锁对比

Lock

ReentrantLock

Java中两个独占锁,ReentrantLock和synchronized,虽然性能上没有太大的区别,但是ReentrantLock的功能更加强大。

ReentrantLock 将由最近成功获得锁,并且还没有释放该锁的线程所拥有。ReentrantLock的实现依赖于AbstractQueueSynchronizer(AQS)。

公平锁加锁:

ReentrantLock:lock() ;FairSync:lock() ;AbstractQueueSynchronizer:acquire(int arg) ;ReentrantLock:try Acquire(int acquires) ;

解锁:

ReentrantLock:unlock() ;AbstractQueueSynchronizer:release(int arg)Sync:tryRelease(int releases) ;

ReentrantLock和Synchronized对比

原子操作的实现

jav使用锁和循环CAS的方式实现原子操作

CAS操作

compareAndSwap的缩写,CAS属于乐观锁,乐观锁是假定冲突不会发生,如果发生冲突了,那就重试直到成功。synchronized、ReentrantLock、Atomic开头的原子类,底层都用到了CAS。CAS底层使用的是JNI调用C代码实现的,CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新。比较且替换指的是当前状态值和预估值相同,则以原子方式将同步状态设置为给定的更新值。

CAS存在三大问题

ABA问题循环时间长开销大只能保证一个共享变量的原子操作,可以考虑把多个变量合成,或者使用锁
使用锁。

偏向锁,轻量级锁和互斥锁。除了偏向锁,其他实现锁的方式都使用了循环CAS获得和释放锁

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。