锁的优化以下:
1.使用无锁方案
2.避免死锁
3.减少锁持有时间
4.锁分离
5.锁粗化
6.减少锁粒度前端
无锁方案单独介绍,避免死锁可参考:Java并发编程入门(九)死锁和死锁定位。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
}
}
复制代码
减少锁粒度通常用于容器类,例如经过map来缓存数据,每一个key是一类数据,如证件类型,客户类型等等,这样在对map操做时能够将锁分离到每个key上,在操做某一种类型的数据时,对key加锁。
Java中的ConcurrentHashMap类内部分红了16个段,每一个段都有本身的锁,这样最大能够有16个并发操做,也是经过减少锁粒度提升了效率。数据结构
end.并发
相关阅读:
Java并发编程(一)知识地图
Java并发编程(二)原子性
Java并发编程(三)可见性
Java并发编程(四)有序性
Java并发编程(五)建立线程方式概览
Java并发编程入门(六)synchronized用法
Java并发编程入门(七)轻松理解wait和notify以及使用场景
Java并发编程入门(八)线程生命周期
Java并发编程入门(九)死锁和死锁定位
Java并发编程入门(十一)限流场景和Spring限流器实现
Java并发编程入门(十二)生产者和消费者模式-代码模板
Java并发编程入门(十三)读写锁和缓存模板
Java并发编程入门(十四)CountDownLatch应用场景
Java并发编程入门(十五)CyclicBarrier应用场景
Java并发编程入门(十六)秒懂线程池差异
Java并发编程入门(十七)一图掌握线程经常使用类和接口
Java并发编程入门(十八)再论线程安全post
Java极客站点: javageektour.com/优化