锁的优化如下:
1.使用无锁方案
2.避免死锁
3.减小锁持有时间
4.锁分离
5.锁粗化
6.减小锁粒度
无锁方案单独介绍,避免死锁可参考:Java并发编程入门(九)死锁和死锁定位。
只对有同步需要的代码块做同步处理,而不一定要对整个方法做同步,例如单例模式的二次检查。
public class Singleton { private static Singleton singleton; private Singleton() {} public static Singleton getInstance() { if (null == singleton) { //减小锁持有时间,而不是把synchronized关键字放在方法上 synchronized (Singleton.class) { if (null == singleton) { singleton = new Singleton(); } } } return singleton; } } 复制代码
1.对于读多写少的数据可以分离读写锁,读读不互斥,读写互斥,写写互斥,这样在读读时能提高效率。
2.对于链表数据结构,如果取数据是做前端获取,放入数据是从尾端获取,那么可以将取数据和放数据的锁分离,参考LinkedBlockingQueue。
获取锁操作会消耗资源,如果一个操作需要频繁的获取锁,而获取锁操作之后的操作很快就能完成,那么可以将获取锁操作合并。例如在循环语句中获取同一个锁,可以将获取锁操作放到循环外。
for (int i = 0; i < size; i++) { synchronized(lock) { //do something } } 复制代码