重量级锁:即为传统锁,是通过互斥量来实现代码同步,但是互斥量相对于CAS(原子性操作),要产生更多的性能消耗。
轻量级锁:轻量级锁是通过CAS来实现同步,相对重量级锁的互斥量,性能会好很多。但是轻量级锁不是为了替代重量级锁。
轻量级锁能够提升程序同步新能的依据是:对于绝大多数的锁,在整个同步周期内都是不存在竞争的,这是一个经验数据。
如果没有竞争,轻量级锁使用CAS操作避免了使用互斥量的开销。但如果存在锁竞争,则轻量级锁会在CAS操作外,还使用了互斥量, 性能反而下降。
偏向锁:偏向锁能提高程序同步性能的场景是:有同步代码,但是只有同一个线程执行该同步代码块(注意和轻量级锁的应用场景的区别)。在这种 场景下,连CAS操作也不需要了。
总结:当多线程环境下,同步代码块经常由同一个线程访问,那么偏向锁将能提升性能;当同步代码块经常被多个线程访问,但是不存在并发情况,那么轻量级锁能够带来程序性能的提升;如果同步代码块不但被多个线程访问,并且发生并发情况,那么轻量级锁反而造成性能下降,不如使用重量级锁。
这些性质都是java内置锁sychronized的特性,java5引进的Lock库不具备。所以经常能在书中看到,一半情况下推荐使用synchronized,因为将来jvm可能会对内置锁进行优化。
推荐资料:
《深入理解java虚拟机——JVM高级特性与最佳实践》
https://www.cnblogs.com/charlesblc/p/5994162.html