美文网首页
锁的性能提升

锁的性能提升

作者: 即墨灯火 | 来源:发表于2019-01-02 02:55 被阅读9次

对于锁的性能提升的考虑,主要包括以下几点

  1. 减小锁持有时间
  2. 减小锁粒度
  3. 读写分离锁来替换独占锁
  4. 锁分离
  5. 锁粗化

1. 减小锁持有时间

简而言之,只在必要时进行同步。

对于一个需要加锁的代码块而言,其中如果有独立的、可以移出同步块的代码,那么就应该将其移出,使得同步块的内容尽可能少,执行时间尽可能短。另一方面,减少锁的持有时间,有助于降低锁冲突的可能性,进而提升系统的并发能力。

2. 减小锁粒度

以ConcurrentHashMap为例,其内部细分了若干个小的HashMap,称为段,默认情况下,一个ConcurrentHashMap将被细分为16个段。借助于段的机制,ConcurrentHashMap只需要对段的粒度加锁,就可以保证线程安全,而不必对整个ConcurrentHashMap进行枷锁。

需要注意的是,减小锁粒度需要考虑全部锁的场景,比如对于ConcurrentHashMap,如果需要获取其size,这就不是段这个机制能够解决的了。

所谓的减少锁粒度,就是指缩小锁定对象的范围,从而减少锁冲突的可能性,进而提高系统的并发能力。

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

Java所提供的读写锁:ReadWriteLock

读多写少的场景,使用读写锁可以有效提升系统的并发能力。相对于上述减小锁粒度的方案(通过分割数据结构)而言,读写锁则是对系统功能点的分割。

4. 锁分离

锁分离是读写锁的进一步延伸。
举个例子,在LinkedBlockingQueue中,put()与take()方法都对当前队列进行了修改操作,但是它们总是分别作用于尾端与前端,从理论上说,两着并不冲突。因此,在JDK的实现中,使用了两把锁来取代独占锁的设计,分离了put()与take()操作。

5. 锁粗化

锁粗化意图在于减少锁的申请与释放次数,其思想与减少锁的持有时间是相反的。但是在不同场合,需要根据实际情况,进行权衡。

相关文章

  • 锁的性能提升

    对于锁的性能提升的考虑,主要包括以下几点 减小锁持有时间 减小锁粒度 读写分离锁来替换独占锁 锁分离 锁粗化 1....

  • 锁性能提升——CopyOnWriteArrayList

    在说CopyOnWriteArrayList之前先说下ArrayList为什么不是线程安全的,通常意义上的线程安全...

  • 锁性能提升——ReadWriteLock

    这篇文章主要记录下ReadWriteLock的实现原理与用处,ReentrantLock可以实现线程安全,但是它的...

  • JDK的锁优化

    JDK1.6重点提升了并发性能,HotSpot开发团队实现了各种锁优化技术,如适应性自旋锁、锁消除、锁粗化、轻量级...

  • ios中常用的锁

    ios中常用的锁 为什么要用到锁?锁是什么 在平时的开发过程中,为了提升我们应用程序的运行效率,性能,我们会经常使...

  • 锁分析(上)

    锁性能分析 iPhone 12真机测试,锁的性能数据对比图 性能从高到低排序:OSSpinLock(自旋锁)>os...

  • ReadWriteLock读写锁

    读写锁,分场景优化,提升性能。 读写锁遵守的基本原则: 允许多个线程同时读共享变量。 只允许一个线程写共享变量。 ...

  • 05 死锁

    相对于上一节中使用XXX.class粗粒度的锁,可以使用细粒度锁提升性能。 首先转账业务的资源:转出账户,转入账户...

  • sychronized原理

    偏向锁适合在只有一个线程执行同步代码时,提升性能线程进入同步代码块是,会通过CAS(compare and swa...

  • Flutter 1.17 中的导航解密和性能提升

    Flutter 1.17 中的导航解密和性能提升Flutter 1.17 中的导航解密和性能提升

网友评论

      本文标题:锁的性能提升

      本文链接:https://www.haomeiwen.com/subject/idralqtx.html