synchronized在jdk1.6的优化

synchronized锁实现了并发安全,但是它有点“重”

,因为当一个线程访问同步方法或者代码块获

取锁了之后,其他的线程都处于等待阻塞状态,浪费CPU的资源,并且频繁的获取和释放锁也消耗

CPU的性能等等,所以以前一提到synchronized大家都说它是一个重量级锁。但是到JDK1.6的时

候就对synchronized进行了各种优化来提高它的效率,如JVM会对java代码进行锁粗化、锁消除处

理,适应性自旋解决自旋占用大量CPU资源问题,并且加入了偏向锁和轻量级锁等对锁进行了升级

优化,最后才是重量级锁

锁粗化:

加锁的共享资源范围越小,那么其他线程等待阻塞的时间就会越短,这样明显比对大范围资

源加锁效率高。但是加锁和释放锁也需要时间和消耗资源的,如果出现频繁的加锁和释放锁

操作那么就会导致消耗CPU性能,锁粗化就是解决这种问题的。

synchronized在jdk1.6的优化_第1张图片

锁消除

锁消除是指当java进行JIT(

Just-In-Time)编译(即时编译:程序运行时把Class文件字节码编译成

本地机器码来提高执行效率)运行程序的时候,通过上下文进行逃逸分析(逃逸分析:如果变量被方

法中使用,又被方法外使用,那么这个变量就发生了逃逸)发现如果变量发生了逃逸那么应该保持锁,

如果没有发生逃逸那么不存在竞争资源的问题从而会把锁消除掉,案例如下:

我们知道StringBuffer是一个线程安全的类,它的append方法被synchronized修饰,但是此处因为

sb变量只是一个局部变量,sb 的所有引用不会 “逃逸” 到 test方法之外其他线程无法访问控制到它,

所以即使append方法操作有锁,JVM即使编译后就会把这个锁消除掉,上述代码就会忽略掉同步锁

而执行。

锁升级简介

JDK1.6后synchronized的锁状态总共有4种:无锁—>偏向锁—>轻量级锁—>重量级锁,锁的升级顺

序是从无锁到重量级的顺序,锁只能升级不能降级。

你可能感兴趣的:(java)