1、减少锁持有的时间
减少锁持有的时间指只在有线程安全的程序上加锁来尽量减少同步代码快对锁的持有时间。
public synchronized void syncMethod(){
othercode1();
mutextMethod();
othercode2();}
//优化后:
public void syncMethod2(){
othercode1();
synchronized(this){
mutextMethod();
}
othercode2();}
注意:减少锁的持有时间有助于降低锁冲突的可能性,进而提升系统的并发能力。
2、减小锁粒度
减小锁粒度指将单个耗时较多的锁操作拆分为多个耗时较少的锁操作来增加锁的并发度,减少同一个锁上的竞争。在减少锁的竞争之后,偏向锁,轻量级锁的使用率才会提高。最典型的例子就是jdk1.7中的ConcurrentHashMap中的分段锁。
3、锁分离
锁分离指根据不同的场景将锁的功能进行分离,以应对不同的拜变化,最常见的锁分离思想就是读写锁【ReadWriteLock】,它根据锁的功能将锁分离成读锁和写锁,这样读读不互斥,读写互斥,写写互斥,既保证了线程安全,又提高了性能。
操作分离思想的可以进一步延伸为只要操作互不影响,就可以进一步拆分,比如LinkedBlockingQueue从头部取数据,并从尾部加入数据。
4、锁粗化
锁粗化指为了保证性能,会要求尽可能将锁的操作细化以减少线程持有锁的时间,但是如果锁分的太细,将会导致系统频繁的获取锁和释放锁,反而影响性能的提升。在这种情况下,建议将关联性强的锁集中起来处理,以提高系统整体的效率。
5、锁消除
在开发中经常会出现在不需要使用锁的情况下误用了锁操作而引起性能的下降,这多数是因为程序编码不规范引起的。检查并消除这些锁来提高系统的性能。