Java 高并发九:锁的优化和注意事项详解高并发九:锁的优化和注意事项详解
本文主要介绍Java高并发锁的优化和注意事项,这里整理了详细的资料,并讲解了 1. 锁优化的思路和方法 2. 虚
拟机内的锁优化 3. 一个错误使用锁的案例 4. ThreadLocal及其源码分析等知识,有需要的小伙伴可以参考下
摘要摘要
本系列基于炼数成金课程,为了更好的学习,做了系列的记录。 本文主要介绍: 1. 锁优化的思路和方法 2. 虚拟机内的锁优化
3. 一个错误使用锁的案例 4. ThreadLocal及其源码分析
1. 锁优化的思路和方法锁优化的思路和方法
在[高并发Java 一] 前言中有提到并发的级别。
一旦用到锁,就说明这是阻塞式的,所以在并发度上一般来说都会比无锁的情况低一点。
这里提到的锁优化,是指在阻塞式的情况下,如何让性能不要变得太差。但是再怎么优化,一般来说性能都会比无锁的情况差
一点。
这里要注意的是,在[高并发Java 五] JDK并发包1中提到的ReentrantLock中的tryLock,偏向于一种无锁的方式,因为在
tryLock判断时,并不会把自己挂起。
锁优化的思路和方法总结一下,有以下几种。
1. 减少锁持有时间
2. 减小锁粒度
3. 锁分离
4. 锁粗化
5. 锁消除
1.1 减少锁持有时间减少锁持有时间
public synchronized void syncMethod(){
othercode1();
mutextMethod();
othercode2();
}
像上述代码这样,在进入方法前就要得到锁,其他线程就要在外面等待。
这里优化的一点在于,要减少其他线程等待的时间,所以,只用在有线程安全要求的程序上加锁
public void syncMethod(){
othercode1();
synchronized(this)
{
mutextMethod();
}
othercode2();
}
1.2 减小锁粒度减小锁粒度
将大对象(这个对象可能会被很多线程访问),拆成小对象,大大增加并行度,降低锁竞争。降低了锁的竞争,偏向锁,轻量
级锁成功率才会提高。
最最典型的减小锁粒度的案例就是ConcurrentHashMap。这个在[高并发Java 五] JDK并发包1有提到。
1.3 锁分离锁分离
最常见的锁分离就是读写锁ReadWriteLock,根据功能进行分离成读锁和写锁,这样读读不互斥,读写互斥,写写互斥,即保
证了线程安全,又提高了性能,具体也请查看[高并发Java 五] JDK并发包1。
读写分离思想可以延伸,只要操作互不影响,锁就可以分离。
比如LinkedBlockingQueue