`
weigang.gao
  • 浏览: 486266 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

锁优化

 
阅读更多

高效并发是JDK1.5到JDK1.6的一个重要改进,HotSpot虚拟机开发团队在这个版本上话费了大量的精力去实现各种锁优化技术,如适应性自旋(Adaptive Spinning),锁消除(Lock Elimination),锁粗化(Lock Coarsening),轻量级锁(Lightweight Locking)和偏向锁(Biased Locking)等,这些技术都是为了在线程之间更高效地共享数据,以及解决竞争问题

 

自旋锁与自适应自旋

前面我们讨论互斥同步的时候,提到了互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力。同时,虚拟机的开发团队也注意到在许多应用上,共享数据的锁定状态只会持续很短的一段时间,为了这段时间去挂起和恢复线程并不值得。如果物理机器有一个以上的处理器,能让两个或以上的线程同时并行执行,我们就可以让后面请求锁的那个线程“稍等一下”,但不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了让线程等待,我们只需要让线程执行一个忙循环(自旋),这项技术就是所谓的自旋锁。

 

自旋等待不能代替阻塞,且先不说对处理器数量的要求,自旋等待本身虽然避免了线程挂起和恢复切换的开销,但它是要占用处理器时间的,因此,如果锁被占用的时间很短,自旋等待的效果就会非常好,反之,如果所被占用的时间很长,那么自旋的线程只会白白消耗处理器资源,而不会做任何有用的工作,反而带来性能上的浪费。因此,自旋等待的时间必须要有一定的限度,如果自旋超过了限定的次数仍然没有成功获得锁,就应当使用传统的方式去挂起线程了。自旋次数的默认值是10次,用户可以使用参数-XX:PreBlockSpin来更改。

 

在JDK1.6中引入了自适应的自旋锁。自适应意味着自旋的时间不再固定了,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也很有可能再次成功,进而它将允许自旋等待持续相对更长的时间,比如100个循环。另外,如果对于某个锁,自旋很少成功获得过,那在以后要获取这个锁时将可能省略掉自旋过程,以避免浪费处理器资源。有了自适应自旋,随着程序运行和性能监控信息的不断完善,虚拟机对程序锁的状况预测就会越来越准确,虚拟机就会变得越来越“聪明”了。

 

 

锁消除

锁消除是指虚拟机即使编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行消除。锁消除的主要判定依据来源于逃逸分析的数据支持,如果判断在一段代码中,推上的所有数据都不会逃逸出去从而被其他线程访问到,那就可以把它们当做栈上数据对待,认为它们是线程私有的,同步加锁就无须进行。

 

 

锁粗化

原则上,我们在编写代码的时候,总是推荐将同步块的作用范围限制得尽量小————只在共享数据的实际作用域中才进行同步,这样为了使得需要同步的操作数量尽可能变小,如果存在锁竞争,那等待锁的线程也能尽快拿到锁。

 

 

 

偏向锁

分享到:
评论

相关推荐

    JVM性能优化:线程锁优化.docx

    Java虚拟机(JVM)性能优化的一个重要领域是线程锁优化,这直接影响到多线程应用程序的效率和并发性能。线程锁是确保多线程环境下数据一致性和线程安全的关键机制。以下是对线程锁优化的一些核心知识点的详细说明: ...

    Oracle数据库性能优化实务闩锁及闩锁优化.ppt

    Oracle数据库性能优化实务闩锁及闩锁优化 Oracle数据库性能优化实务闩锁及闩锁优化是指在Oracle数据库中对性能的优化,以提高数据库的执行效率和稳定性。闩锁是一种机制,用于保护Oracle数据库的核心内存结构,防止...

    Java虚拟机中的只读锁优化.pdf

    Java虚拟机中的只读锁优化 Java虚拟机(JVM)中的锁机制是实现多线程共享数据结构同步的关键机制。锁机制维护的临界区域通常对共享数据结构只进行读操作。只读锁是指当某个线程持有锁在只读临界区域时,其他线程...

    锁优化技术分享.pdf

    【锁优化技术分享】 在Java并发编程中,锁优化是一个重要的议题,旨在提高多线程环境下的系统性能和效率。本文主要围绕代码层面和JVM层面的锁优化技术展开讨论。 1. **避免死锁** 死锁是并发编程中的常见问题,四...

    Oracle数据库性能优化实务闩锁及闩锁优化.pptx

    Oracle数据库性能优化实务中,闩锁(Latch)与闩锁优化是关键的议题。闩锁是一种轻量级的锁机制,用于保护Oracle数据库内部的数据结构,确保并发访问时的一致性和完整性。它们主要分为三类:应用级锁、数据字典锁和...

    Oracle数据库性能优化实务_闩锁及闩锁优化.pptx

    在进行闩锁优化时,需要综合考虑以下几个方面: 1. 减少不必要的锁竞争,通过合理的设计和优化避免高并发下的锁冲突。 2. 分析v$lock和等待事件,识别阻塞热点并优化相关的业务逻辑或SQL语句。 3. 调整数据库参数,...

    JAVA锁优化和膨胀过程.docx

    JAVA 锁优化和膨胀过程 在 HotSpot 虚拟机中,锁优化和膨胀过程是两个重要的技术,旨在提高多线程之间共享数据的效率和处理竞争问题。这些技术包括自适应自旋(Adaptive Spinning)、锁删除(Lock Elimination)、...

    CPU自旋锁优化20191020-CLK-new1

    在现代多核、多CPU插槽的系统中,CPU自旋锁优化对于提升系统性能至关重要。自旋锁是一种同步机制,用于保护临界区,即一段必须被单个线程独占执行的代码。在多处理器环境中,自旋锁可能会引发一系列问题,特别是在非...

    14丨多线程之锁优化(下):使用乐观锁优化并行操作.html

    14丨多线程之锁优化(下):使用乐观锁优化并行操作.html

    13丨多线程之锁优化(中):深入了解Lock同步锁的优化方法.html

    13丨多线程之锁优化(中):深入了解Lock同步锁的优化方法.html

    12丨多线程之锁优化(上):深入了解Synchronized同步锁的优化方法.html

    12丨多线程之锁优化(上):深入了解Synchronized同步锁的优化方法.html

    Linux调度器免锁优化方法研究.pdf

    1. 基础优化:这一层次的优化主要关注代码层面,目标是通过重构代码,尽可能缩小临界区,减少锁的使用。这种方法直接修改调度器的源代码,将可能导致锁冲突的代码段进行重新设计,以避免不必要的锁获取和释放,从而...

    Java高并发实战,锁的优化.docx

    本文主要探讨了Java中的锁优化技术,包括自旋锁、锁消退、锁粗化以及轻量级锁。 自旋锁是一种优化策略,其核心思想是当一个线程在尝试获取锁时,如果锁已经被其他线程持有,它不会立即进入阻塞状态,而是循环等待,...

    mysql数据库锁+优化.pdf

    4. **锁优化策略**: - 减少锁定时间:尽可能减少事务的执行时间,避免长时间持有锁,以降低锁竞争和提高并发性能。 - 锁粒度的选择:选择更细粒度的锁可以提高并发,但可能导致更高的锁冲突;反之,更粗粒度的锁...

    【Java正来-深入理解JVM】线程安全与优化。xmind思维导图

    线程安全与锁优化:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者再调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果。

    关于Java多线程编程锁优化的深入学习

    在Java多线程编程中,锁优化是一个至关重要的主题,它关乎程序的性能和稳定性。本文将深入探讨几种有效的锁优化策略,帮助开发者提升并发环境下的程序效率。 首先,应尽量避免锁住整个方法。当在一个普通成员函数上...

    Java并发篇乐观锁,悲观锁,自旋锁

    6. **锁优化**: - **减少锁持有时间**:尽量缩短锁的生命周期,降低并发冲突的可能性。 - **减小锁粒度**:如ConcurrentHashMap的分段锁,提高并行度。 - **锁分离**:如ReadWriteLock,读写操作分别用不同的锁...

    彻底理解Java中的各种锁.pdf

    Java虚拟机(JVM)通过多种锁优化技术来提高锁的性能和减少锁操作对系统资源的消耗。例如,自适应自旋锁、偏向锁、轻量级锁和重量级锁都是JVM实现的锁优化技术。自适应自旋锁会根据锁的状态和线程的运行情况调整自旋...

    sybase数据库查被锁的表.doc

    锁表查询可以帮助数据库管理员了解当前数据库中的锁情况,从而进行锁优化和故障诊断。 下面是 Sybase 数据库锁表查询的示例代码: ```sql SELECT l.spid, locktype=CONVERT(CHAR(12),name), dbname=CONVERT...

    偏向锁-轻量级锁-重量级锁

    本文将详细解析Java中的偏向锁、轻量级锁和重量级锁,这些都是JVM为了提高并发性能而实现的锁优化策略。 首先,我们从最简单的偏向锁开始。**偏向锁**的设计理念是假设大多数情况下,锁都不会被多个线程竞争。当一...

Global site tag (gtag.js) - Google Analytics