分析

背景:DN性能优化的一部分
目标:AutoCloseableLock 改为 ReadWriteLock

知识回顾:假设在程序中定义一个共享的数据结构,它大部分时间提供读服务,而写操作占有的时间很少,但是写操作完成之后的更新需要对后续的读服务可见。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(也就是说:读-读能共存,读-写不能共存,写-写不能共存)。这就需要一个读/写锁来解决这个问题。

ReentrantReadWriteLock的实现里面重要特性:1、公平性:非公平锁(默认):非公平锁的吞吐量要高于公平锁。(公平锁概念:公平锁利用AQS的CLH队列,释放当前保持的锁时,优先为等待时间最长的那个写操作分配写入锁)

代码实现

Hadoop自定义实现了一套支持try-with-resource的锁。如下:

public class AutoCloseableLock implements AutoCloseable {private final Lock lock;public AutoCloseableLock() {this(new ReentrantLock());}public AutoCloseableLock(Lock lock) {this.lock = lock;}public AutoCloseableLock acquire() {lock.lock();return this;}public void release() {lock.unlock();}@Overridepublic void close() {release();} //...

当然上述只是文本的背景,只是指出在代码中会使用try-with-resource

锁的改动如下:


直接将 datasetLock 改为 datasetWriteLock 和 datasetReadLock。排它锁则新定义一个datasetRWLock。

原来的datasetLock直接使用的是ReentrantLock,改进后使用InstrumentedReadWriteLock。

在使用的时候:

volumeMap = new ReplicaMap(datasetLock);

改为:

volumeMap = new ReplicaMap(datasetRWLock);
private void activateVolume(ReplicaMap replicaMap,Storage.StorageDirectory sd, StorageType storageType,FsVolumeReference ref) throws IOException {try (AutoCloseableLock lock = datasetLock.acquire()) {

改为:

private void activateVolume(ReplicaMap replicaMap,Storage.StorageDirectory sd, StorageType storageType,FsVolumeReference ref) throws IOException {try (AutoCloseableLock lock = datasetWriteLock.acquire()) {

那么会影响到哪些方法呢:

  • 对于FsVolumeImpl类,全部都是由datasetLock 改为datasetWriteLock,对于改为writeLock的地方,基本无影响;volumeMap = new ReplicaMap(datasetLock);改为 volumeMap = new ReplicaMap(datasetRWLock);基本无影响。
  • ProvidedVolumeImpl类中 bpVolumeMap = new ReplicaMap(new AutoCloseableLock()); 改为 bpVolumeMap = new ReplicaMap(new ReentrantReadWriteLock());
  • 在ReplicaMap类中全都改为writeLock,基本不影响。

总结:

review全部的改动点,都是将排它锁改为读写锁中的写锁,其实达到的效果是一样的,并没有达到拆锁的目的,不会提升性能。为什么要这样改动呢?看原文:

The first conservative step, would be to change the current lock and then make all accesses to it obtain the write lock. That way, we should keep the current behaviour and then we can selectively move some lock accesses to the readlock in separate Jiras.

简单来说就是拆锁的第一步,保守改动,换锁拆锁但是全部使用写锁,这样达到第一阶段的目的。为后续加入读锁做好准备。

必须要加入后续的PATCH。不然拆锁的效果不能生效。

测试

单元测试通过

[DN优化] [锁优化] [HDFS-15150] Introduce read write lock to Datanode相关推荐

  1. HDFS 细粒度锁优化,FusionInsight MRS有妙招

    本文分享自华为云社区<FusionInsight MRS HDFS 细粒度锁优化实践>,作者:pippo. 背景 HDFS依赖NameNode作为其元数据服务.NameNode将整个命名空 ...

  2. 深入浅出JVM的锁优化案例

    锁优化 适应性自旋(Adaptive Spinning) 线程阻塞的时候,让等待的线程不放弃cpu执行时间,而是执行一个自旋(一般是空循环),这叫做自旋锁. 自旋等待本身虽然避免了线程切换的开销,但它 ...

  3. Java中的锁原理、锁优化、CAS、AQS详解

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:景小财 www.jianshu.com/p/e674ee68 ...

  4. 如何升级jdk_简述面试常见问题的锁升级与锁优化

    上一篇讲了锁与线程安全的关系,讲到jdk经历了几个版本对锁进行了优化,这里简单梳理一下锁优化. 锁升级过程就是锁优化 在JDK最开始的时候synchronized属于重量级的锁,每次加锁都是通过操作系 ...

  5. Java 多线程编程(锁优化)

    来自:老九学堂 并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问. 加锁会带来性能上的损坏,似乎是众所周知的事情. 然而,加锁本身不会带来多少的性能消耗,性能主要是在线 ...

  6. Java锁优化思路及JVM实现

    1. 锁优化的思路和方法 这里提到的锁优化,是指在阻塞式的情况下,如何让性能不要变得太差.但是再怎么优化,一般来说性能都会比无锁的情况差一点. 这里要注意的是,在ReentrantLock中的tryL ...

  7. 深入理解java虚拟机(7)---线程安全  锁优化

    关于线程安全的话题,足可以使用一本书来讲解这些东西.<Java Concurrency in Practice> 就是讲解这些的,在这里 主要还是分析JVM中关于线程安全这块的内容. 1. ...

  8. 深入理解JVM虚拟机(十一):线程安全与锁优化

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

  9. 多线程高并发 底层锁机制与优化的最佳实践——各种锁的分类 || synchronized 关键字 倒底锁的是什么东西?|| CAS与ABA问题||锁优化||轻量级锁一定比重量级锁的性能高吗

    多线程高并发 底层锁机制与优化的最佳实践 各种锁的分类 加上synchronized 关键字,共享资源就不会出错 synchronized 关键字 倒底锁的是什么东西? synchronized 锁的 ...

最新文章

  1. 盘点程序员写过的惊天Bug:亏损30亿、致6人死亡,甚至差点毁灭世界
  2. 关于png、背景透明疑难杂症综合帖
  3. IoT 云服务加速产业创新,推进规模商用
  4. 各大网站CSS代码初始化集合
  5. 观察者模式的应用场景
  6. LiveVideoStackCon讲师热身分享 ( 九 ) —— 51Talk音视频技术思考及非典型挑战
  7. Dev C++ 无法调试问题的解决——小白也能看懂!
  8. Redis——学习之路一(初识redis)
  9. Android开发--apk的生成
  10. 和为S的连续正数序列(python)
  11. 关于PC上的护眼大师这个软件
  12. cognex扫码枪识别内容直接_康耐视cognex DataMan8600系列-手持终端-条码扫描枪-PDA-扫描模块-条码打印机-苏州奥维尔...
  13. 树莓派+传感器+公网服务器 组件自己的物联网平台(四)制作一个智能鱼缸
  14. linux tig不支持中文,tig — 让 git 命令行可视化
  15. 时空之巅服务器在线玩,天域之巅 - 《神鬼传奇》官方网站
  16. linux命令察看图片
  17. 武汉全款买房,普通人不吃不喝需要10年,这位程序员只用了5年
  18. 线程池使用的10个坑(二)
  19. 初学JavaScript:数组
  20. [LeetCode]682. 棒球比赛(Baseball Game)Java

热门文章

  1. 7讲项目实战js第三区域响应式菜单续
  2. 【论文总结】《Neural Reading Comprehension and Beyond(2018,第一部分)》(阅读理解任务综述)
  3. MySQL消除笛卡尔积的方法_SQL查询中的笛卡尔积现象解决方法
  4. 计算机基础项目教程,计算机基础项目式教程(Windows10+Office2013)--详细介绍
  5. 这是一个悲伤的程序员爱情故事
  6. 基于JAVA的课程设计《智能捡火柴小程序》
  7. GBase 8c数据库技术指标
  8. MATLAB如何导出高质量的图片?
  9. dubbo负载均衡。
  10. 解决某些手机RadioGroup中的RadioButton不居中的问题