• 有助于提高"锁"性能的几点建议


    有助于提高"锁"性能的几点建议

    1.减少锁持有时间

        public synchronized void syncMethod() {
            othercode1();
            mutextMethod();
            othercode2();
        }
    

    syncMethod()方法中,假设只有mutextMethod()方法是有同步需要的,如果othercode1()和othercode2()分别是重量级的方法,则会花费较长的CPU时间.

    一个较为优化的解决方案是,只在必要时进行同步,这样就能明显减少线程持有锁的时间,提高系统的吞吐量;

        public void syncMethod() {
            othercode1();
            synchronized (this) {
                mutextMethod();
            }
            othercode2();
        }
    

    2.减小锁粒度

    这种技术典型的使用场景就是ConcurrentHashMap.

    对于HashMap来说,最重要的两个方法就是get() 和put(),一种最自然的想法就是对整个HashMap加锁,必然可以得到一个线程安全的对象.但是这样做,我们就认为加锁粒度太大.对于ConcurrentHashMap,它内部进一步细分了若干个小的hashMap,称之为段(SEGMENT).默认的情况下,一个ConcurrentHashMap被进一步细分为16个段

    如果需要在ConcurrentHashMap中增加一个新的表项,并不是整个HashMap加锁,而是首先根据hashcode得到该表项应该被存放到哪个段中,然后对该段加锁,并完成put()操作.在多线程环境中,如果多个线程同时进行put()操作,只要被加入的表项不存放在同一个段中,则线程间便可以做到真正的并行

    3.读写分离锁来替换独占锁

    在读多写少的场合,使用读写锁可以有效提升系统的并发能力

    4.锁分离

    如果将读写锁的思想进一步的延伸,就是锁分离.读写锁根据读写锁操作功能上的不同,进行了有效的锁分离.使用类似的思想,也可以对独占锁进行分离.

    5.锁粗化

    凡事都有一个度,如果对同一个锁不停地进行请求,同步和释放,其本身也会消耗系统宝贵的资源,反而不利于性能的优化

    为此,虚拟机在遇到一连串连续地对同一锁不断进行请求和释放的操作时,便会把所有的锁操作整合成对锁的一次请求,从而减少对锁的请求同步次数,这个操作叫做锁的粗化.

    	public void demoMethod() {
            synchronized (lock) {
                //do sth
            }
            
            //做其他不需要的同步的工作,但能很快执行完毕
            synchronized (lock) {
                //do sth.
            }
        }
    

    上述代码会被整合成

    	public void demoMethod() {
            synchronized (lock) {
                //do sth
                //做其他不需要的同步的工作,但能很快执行完毕
            }
        }
    

    在开发过程中,大家也应该有意识地在合理地场合进行锁的粗化,尤其当在循环内请求锁时.

    for (int i = 0; i < CIRCLE; i++) {
      synchronized (lock){
    
      }
    }
    

    一种更加合理地做法应该是:

    synchronized (lock){
      for (int i = 0; i < CIRCLE; i++) {
    
      }
    }
    
  • 相关阅读:
    【转】第 02 天:在 Windows 平台必裝的三套 Git 工具
    【转】整理一下Android中的ListView
    【转】Git图形化界面客户端大汇总
    【转】探讨android更新UI的几种方法----不错
    【转】MTK Android Driver知识大全
    【转】Linux I2C设备驱动编写(三)-实例分析AM3359
    【转】Linux I2C设备驱动编写(二)
    【转】Linux I2C设备驱动编写(一)
    【转】(DT系列六)devicetree中数据和 struct device有什么关系
    空间同构(isomorphic)
  • 原文地址:https://www.cnblogs.com/luozhiyun/p/9234065.html
Copyright © 2020-2023  润新知