• 偏向锁:竞争不高的情况下,可以通过偏向提高性能 -XX:+UseBiasedLocking 1.6默认启用 -XX:BiasedLockingStartupDelay=0 默认jvm启动时并不启用偏向锁,此设置是指jvm启动时开启偏向锁
    轻量级锁
    自旋锁:当竞争存在时,如果线程可以很快获得锁,那么可以不在OS层挂起线程,让线程做几个空操作(自旋) jdk1.6使用-XX:+UseSpinning开启 jdk1.7去掉了此参数,改为内置实现,同步块长自旋失败会降低系统性能,同步块短自旋成功,节省线程挂起切换时间,提升系统性能
    是内置于JVM中的获取锁的优化方法,获取锁的步骤:
    偏向锁可用会先尝试偏向锁
    轻量级锁可用会先尝试轻量级锁
    以上都失败,尝试自旋锁
    再失败,尝试普通锁,使用OS互斥量在操作系统层挂起

    优化:
    减少锁持有时间:只在需要同步的代码块加同步
    减小锁粒度:将大对象拆成小对象,例如ConcurrentHashMap
    ConcurrentHashMap分成若干个Segment:Segment<K, V>[] segments, segment中维护HashEntry<K, V>,put操作时先定位到Segment,锁定一个Segment,执行put,减小粒度后,允许若干个线程同时进入
    锁分离:根据功能进行锁分离ReadWriteLock,读多写少的情况,可以提高性能,例如LinkedBlockingQueue 队列 链表
    锁粗化:避免频繁释放获取锁
    锁消除:在即时编译器时,如果发现不可能被共享的对象,则可以消除这些对象的锁操作
    无锁的一种实现方式:CAS(Compare And Swap) 非阻塞的同步 CAS(V,E,N),在应用层面判断多线程的干扰,如果有干扰,则通知线程重试 例如java.util.current.atomic.AtomicInteger

  • 相关阅读:
    调用Type.InvokeMember()时出现MissingMethodException
    C#学习之Delegate
    WCF之元数据交换 (Metadata Exchange)
    定义Enum的开始和结束,这样就能循环Enum了
    定制自己的Visual Studio的Debugger Visualizer
    C#中 #if DEBUG 和 Conditional("DEBUG")的区别
    从哪里开始学习Windows 8?(zz)
    Macro 小总结
    WPF应用的图标
    如何把 Visutal studio中的“printonbreakpoint”消息打印在程序的任何地方
  • 原文地址:https://www.cnblogs.com/cyf18/p/14289266.html
Copyright © 2020-2023  润新知