Java并发编程入门(十)锁优化

一、锁优化

锁的优化如下:
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
    }
}
复制代码

五、减小锁粒度

减小锁粒度一般用于容器类,例如通过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并发编程入门(十二)生产者和消费者模式-代码模板


站点: javashizhan.com/


微信公众号:


猜你喜欢

转载自juejin.im/post/5d96bc5e518825512e51e234