首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

分段锁的原理

前言:在分析ConcurrentHashMap的源码的时候,了解到这个并发容器类的加锁机制是基于粒度更小的分段锁,分段锁也是提升多并发程序性能的重要手段之一。...在某些情况下我们可以将锁分解技术进一步扩展为一组独立对象上的锁进行分解,这成为分段锁。...所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。...当然,任何技术必有其劣势,与独占锁相比,维护多个锁来实现独占访问将更加困难而且开销更加大。 下面给出一个基于散列的Map的实现,使用分段锁技术。...但是对于某些方法却要获得全部的锁,比如clear()方法,但是获得全部的锁不必是同时获得,可以使分段获得,具体的查看源码。 这就是分段锁的思想。

5.6K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ConcurrentHashMap的锁分段技术

    ConcurrentHashMap的锁分段技术 HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据...,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁...,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。...Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。...HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。

    81100

    常见的Java锁总结:公平锁,独享锁,互斥锁,乐观锁,分段锁,偏向锁,自旋锁等等

    介绍的内容如下: 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享锁 / 共享锁 4.互斥锁 / 读写锁 5.乐观锁 / 悲观锁 6.分段锁 7.偏向锁 / 轻量级锁 / 重量级锁 8....分段锁 分段锁其实是一种锁的设计,并不是具体的一种锁,对于ConcurrentHashMap而言,其并发的实现就是通过分段锁的形式来实现高效的并发操作。...并发容器类的加锁机制是基于粒度更小的分段锁,分段锁也是提升多并发程序性能的重要手段之一。 在并发程序中,串行操作是会降低可伸缩性,并且上下文切换也会减低性能。...在某些情况下我们可以将锁分解技术进一步扩展为一组独立对象上的锁进行分解,这成为分段锁。...所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

    1.8K50

    Java的ConcurrentHashMap是使用的分段锁?

    了不起在前两天的时候给大家讲述了关于这个 Java 的公平锁,非公平锁,共享锁,独占锁,乐观锁,悲观锁,递归锁,读写锁,今天我们就再来了解一下其他的锁,比如,轻量级锁,重量级锁,偏向锁,以及分段锁。...然而,请注意以下几点: 偏向锁的使用是由JVM动态决定的,你不能强制JVM使用偏向锁。 在高并发环境下,如果锁竞争激烈,偏向锁可能会被撤销并升级到更重的锁状态,如轻量级锁或重量级锁。...分段锁 在Java中,"分段锁"并不是一个官方的术语,但它通常被用来描述一种并发控制策略,其中数据结构或资源被分成多个段,并且每个段都有自己的锁。...尽管如此,"分段锁"这个概念仍然可以用来描述这种将数据结构分成多个可独立锁定的部分的通用策略。...我们看一个分段锁实现安全计数器的代码: import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock

    12710

    Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等

    介绍的内容如下: 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享锁 / 共享锁 4.互斥锁 / 读写锁 5.乐观锁 / 悲观锁 6.分段锁 7.偏向锁 / 轻量级锁 / 重量级锁 8....分段锁 分段锁其实是一种锁的设计,并不是具体的一种锁,对于ConcurrentHashMap而言,其并发的实现就是通过分段锁的形式来实现高效的并发操作。...并发容器类的加锁机制是基于粒度更小的分段锁,分段锁也是提升多并发程序性能的重要手段之一。 在并发程序中,串行操作是会降低可伸缩性,并且上下文切换也会减低性能。...在某些情况下我们可以将锁分解技术进一步扩展为一组独立对象上的锁进行分解,这成为分段锁。...所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

    1.6K00

    Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等

    介绍的内容如下: 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享锁 / 共享锁 4.互斥锁 / 读写锁 5.乐观锁 / 悲观锁 6.分段锁 7.偏向锁 / 轻量级锁 / 重量级锁 8....分段锁 分段锁其实是一种锁的设计,并不是具体的一种锁,对于ConcurrentHashMap而言,其并发的实现就是通过分段锁的形式来实现高效的并发操作。...并发容器类的加锁机制是基于粒度更小的分段锁,分段锁也是提升多并发程序性能的重要手段之一。 在并发程序中,串行操作是会降低可伸缩性,并且上下文切换也会减低性能。...在某些情况下我们可以将锁分解技术进一步扩展为一组独立对象上的锁进行分解,这成为分段锁。...所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

    62520

    从分段锁到 CAS:ConcurrentHashMap的进化之路

    本文将深入探讨ConcurrentHashMap的设计演进,特别关注为什么在Java 8中放弃了分段锁,以及如何通过CAS(Compare-And-Swap)来解决相关问题。...早期的分段锁设计在Java 1.5版本之前,ConcurrentHashMap采用了分段锁的设计。...内存开销分段锁设计需要维护多个锁和多个段的状态信息,这会导致一定的内存开销。而且,锁的数量是固定的,如果初始化时选择了不合适的段数,可能会导致性能不佳。3....死锁风险分段锁设计也存在死锁的风险,如果多个线程在不同的段上争夺锁,并且同时需要访问其他段的数据,可能会导致死锁。...Java 8的改进:CAS操作为了解决分段锁设计中存在的问题,Java 8中对ConcurrentHashMap进行了重大改进,引入了CAS操作(Compare-And-Swap)。

    1K50

    java8的ConcurrentHashMap为何放弃分段锁

    今天突然被一个同事问到java8为何放弃分段锁,于是花了点时间针对这个问题进行了小小的总结。...jdk1.7分段锁的实现 和hashmap一样,在jdk1.7中ConcurrentHashMap的底层数据结构是数组加链表。...关于分段锁 段Segment继承了重入锁ReentrantLock,有了锁的功能,每个锁控制的是一段,当每个Segment越来越大时,锁的粒度就变得有些大了。...分段锁的优势在于保证在操作不同段 map 的时候可以并发执行,操作同段 map 的时候,进行锁的竞争和等待。这相对于直接对整个map同步synchronized是有优势的。...缺点在于分成很多段时会比较浪费内存空间(不连续,碎片化); 操作map时竞争同一个分段锁的概率非常小时,分段锁反而会造成更新等操作的长时间等待; 当某个段很大时,分段锁的性能会下降。

    18.9K42

    Redis 独占锁、分段锁、发布订阅,自动注入Spring容器高级编码分享!

    这些场景包括;Redis 的基本缓存使用、Redis 加锁(Redisson 提供了很多锁的方式,这里我们会展示独占锁和无锁化的性能测试)。...]"; return createOrder(orderAggregate); } finally { lock.unlock(); } } /** 分段锁...对于第2类的场景,是采用了分段或者自增滑块的锁方式进行处理,减少对同一个锁的等待,而是生成一堆的锁,让用户去使用。也就是最开始案例背景的图中,一个个⭕️圆圈的分段锁 5....createOrder 不使用锁、createOrderByLock 使用独占锁、createOrderByNoLock 是分段锁,也可以当做无锁处理。...createOrderByNoLock 分段锁无锁接近于直接操作库。 测试的过程中,还会看到监听订阅的消息,在控制台打印。 2.

    99020

    20.Atmoic系列Strimped64分段锁底层实现源码剖析

    老王:我们还以银行办事大厅的常规窗口、备用窗口为例子说明了什么是分段锁机制,这些东西啊,都要记得啊;有上一章的基础、懂得什么是分段锁,这一章我才能带你来深入的分析一下Striped64的分段锁机制的实现...老王:那这一章我们就来分析分析,从longAccmulate方法内部源码角度了解的分段锁实现机制到底是怎么样子的?...5.讲解了AtomicInteger在高并发下的劣势,锁竞争激烈导致大量线程自旋; 6.讲解了什么是分段锁?LongAdder底层是怎么通过分段锁解决AtomicInteger在高并发下的劣势的?...7.最后分析了LongAdder的父类Striped64,在底层是怎么实现分段锁的,深入到源码级别去分析了分段锁的实现。...20.Atmoic系列Strimped64分段锁底层实现源码剖析 JAVA并发专题《金丹篇》 21.AQS是个啥?

    24340

    19.Atomic系列之LongAdder的底层原理(分段锁提升并发性能)

    老王:你说的大概准确,但是你能说说什么是分段锁吗?LongAdder底层又是怎么实现分段锁的? 小陈:额,这个,我就不太懂了,还是老王你来说吧.........老王:好,那我先给你讲讲什么是分段锁吧,讲完分段锁之后再给讲LongAdder是怎么实现分段锁的 老王:下面我以银行办事大厅多窗口机制来给你将什么是分段锁 银行办事大厅多窗口讲解分段锁 如下图所示: (...老王:上面的这种机制啊,其实就是类似将锁拆成锁多个段;其中每个窗口就是一段锁,只有被派到同一个窗口的用户才会存在竞争,使用分段锁大大减少了竞争,提升了并发性能。...老王:好了,下面再给你讲讲LongAdder的底层原理和怎么使用分段锁优化并发性能的?...LongAdder属性 老王:首先啊,我给你说LongAdder之前得给你介绍一下Striped64这个类,Striped64这个类是分段锁的基础,实现分段锁的功能,而LongAdder继承Striped64

    19420
    领券