并发编程原理与实战(三十七)高并发利器ConcurrentHashMap核心特性解析

浅析HashMap与ConcurrentHashMap的线程安全性 本文要解决的问题: 最近无意中发现有很多对Map尤其是HashMap的线程安全性的话题讨论,在我的理解中,对HashMap的理解中也就知道它是线程不安全的,以及HashMap的底层算法采用了链地址法来解决哈希冲突的知识,但是对其线程安全性的认知有限,故写这篇博客的目的就是让和我一样对这块内容不熟悉的小伙伴有一个对HashMap更深的认知。 哈希表 在数据结构中有一 阅读详情

本文来学习并发编程和面试中经常见的ConcurrentHashMap。先通过官方文档对ConcurrentHashMap做个整体上的了解。

高并发的哈希表

引入ConcurrentHashMap主要是为了解决HashMap在多线程环境下的线程安全问题,并克服Hashtable因全局锁导致的性能瓶颈‌。

/**
 * A hash table supporting full concurrency of retrievals and
 * high expected concurrency for updates. This class obeys the
 * same functional specification as {@link java.util.Hashtable}, and
 * includes versions of methods corresponding to each method of
 * {@code Hashtable}. However, even though all operations are
 * thread-safe, retrieval operations do <em>not</em> entail locking,
 * and there is <em>not</em> any support for locking the entire table
 * in a way that prevents all access.  This class is fully
 * interoperable with {@code Hashtable} in programs that rely on its
 * thread safety but not on its synchronization details.
 */

一个支持检索操作完全并发且更新操作具有高预期并发性的哈希表。此类遵循与 java.util.Hashtable相同的功能规范,包含对应于 Hashtable 每个方法的版本。虽然所有操作都是线程安全的,但检索操作不涉及锁机制,且不支持锁定整个表以阻止所有访问。在依赖其线程安全性但不依赖同步细节的程序中,此类与Hashtable完全互操作。

/* <p>Retrieval operations (including {@code get}) generally do not
 * block, so may overlap with update operations (including {@code put}
 * and {@code remove}). Retrievals reflect the results of the most
 * recently <em>completed</em> update operations holding upon their
 * onset. (More formally, an update operation for a given key bears a
 * <em>happens-before</em> relation with any (non-null) retrieval for
 * that key reporting the updated value.)  For aggregate operations
 * such as {@code putAll} and {@code clear}, concurrent retrievals may
 * reflect insertion or removal of only some entries.  Similarly,
 * Iterators, Spliterators and Enumerations return elements reflecting the
 * state of the hash table at some point at or since the creation of the
 * iterator/enumeration.  They do <em>not</em> throw {@link
 * java.util.ConcurrentModificationException ConcurrentModificationException}.
 * However, iterators are designed to be used by only one thread at a time.
 * Bear in mind that the results of aggregate status methods including
 * {@code size}, {@code isEmpty}, and {@code containsValue} are typically
 * useful only when a map is not undergoing concurrent updates in other threads.
 * Otherwise the results of these methods reflect transient states
 * that may be adequate for monitoring or estimation purposes, but not
 * for program control.
 */

写先行发生于读

检索操作(包括get)通常不会阻塞,因此可能与更新操作put 和remove重叠。检索操作反映的是在其开始时已完成的最近更新操作的结果。(更正式地说,针对特定键的更新操作与该键的(非空)检索操作之间存在 happens-before 关系,该检索操作会报告更新后的值。)对于putAll 和clear等聚合操作,并发检索可能仅反映部分条目的插入或删除。同样,迭代器(Iterators)、拆分迭代器(Spliterators)和枚举(Enumerations)会返回反映哈希表在迭代器/枚举创建时或之后某个时间点的元素。它们不会抛出 java.util.ConcurrentModificationException 。不过,迭代器设计为仅供单线程使用。需注意,包括 size、isEmpty 和 containsValue在内的聚合状态方法的结果通常仅在哈希表未进行并发更新时才有用。否则,这些方法的结果反映的是可能适用于监控或估计目的但不可用于程序控制的瞬态状态。

/* <p>The table is dynamically expanded when there are too many
 * collisions (i.e., keys that have distinct hash codes but fall into
 * the same slot modulo the table size), with the expected average
 * effect of maintaining roughly two bins per mapping (corresponding
 * to a 0.75 load factor threshold for resizing). There may be much
 * variance around this average as mappings are added and removed, but
 * overall, this maintains a commonly accepted time/space tradeoff for
 * hash tables.  However, resizing this or any other kind of hash
 * table may be a relatively slow operation. When possible, it is a
 * good idea to provide a size estimate as an optional {@code
 * initialCapacity} constructor argument. An additional optional
 * {@code loadFactor} constructor argument provides a further means of
 * customizing initial table capacity by specifying the table density
 * to be used in calculating the amount of space to allocate for the
 * given number of elements.  Also, for compatibility with previous
 * versions of this class, constructors may optionally specify an
 * expected {@code concurrencyLevel} as an additional hint for
 * internal sizing.  Note that using many keys with exactly the same
 * {@code hashCode()} is a sure way to slow down performance of any
 * hash table. To ameliorate impact, when keys are {@link Comparable},
 * this class may use comparison order among keys to help break ties.
 *

碰撞与扩容

当发生过多碰撞(即具有不同哈希码但根据表大小取模后落入同一槽位的键)时,该表会动态扩容,预期平均效果是保持每个映射(特指键Key与值Value之间的关联关系,或者说键值对)约两个存储桶(对应于0.75的扩容负载因子阈值)。随着映射的增删,实际容量可能围绕该平均值存在较大波动,但总体上维持了哈希表普遍接受的时间/空间权衡策略。不过,此类哈希表或其他任何哈希表的扩容操作都可能是相对较慢的操作。若有可能,建议通过可选构造参数initialCapacity 提供容量预估。额外的可选构造参数loadFactor可通过指定表密度,进一步定制初始容量计算方式。此外,为兼容该类旧版本,构造器还可选择性地提供预期concurrencyLevel作为内部容量规划的额外提示。需注意,使用大量具有相同 hashCode()的键必然会显著降低哈希表性能。为缓解此问题,当键实现Comparable 接口时,此类可能利用键间的比较顺序来帮助解决哈希冲突。

键值特性

/* <p>A {@link Set} projection of a ConcurrentHashMap may be created
 * (using {@link #newKeySet()} or {@link #newKeySet(int)}), or viewed
 * (using {@link #keySet(Object)} when only keys are of interest, and the
 * mapped values are (perhaps transiently) not used or all take the
 * same mapping value.
 *
 * <p>A ConcurrentHashMap can be used as a scalable frequency map (a
 * form of histogram or multiset) by using {@link
 * java.util.concurrent.atomic.LongAdder} values and initializing via
 * {@link #computeIfAbsent computeIfAbsent}. For example, to add a count
 * to a {@code ConcurrentHashMap<String,LongAdder> freqs}, you can use
 * {@code freqs.computeIfAbsent(key, k -> new LongAdder()).increment();}
 *
 * <p>This class and its views and iterators implement all of the
 * <em>optional</em> methods of the {@link Map} and {@link Iterator}
 * interfaces.
 *
 * <p>Like {@link Hashtable} but unlike {@link HashMap}, this class
 * does <em>not</em> allow {@code null} to be used as a key or value.
 *
 */

可以通过两种方式创建ConcurrentHashMap的Set视图:使用newKeySet或newKeySet(int)方法进行创建,或通过keySet(Object)方法进行只读访问。当仅需要关注键而无需使用映射值(或所有值都采用相同的映射值)时,这种方式特别适用。

ConcurrentHashMap可通过 java.util.concurrent.atomic.LongAdder值结合computeIfAbsent初始化,实现可伸缩的频次统计(直方图或多集合的一种形式)。例如,要向 ConcurrentHashMap<String,LongAdder> freqs中添加计数,可使用:freqs.computeIfAbsent(key, k -> new LongAdder()).increment();

本类及其视图和迭代器实现了Map和Iterator接口中所有可选的方法。

像Hashtable但不像HashMap,该类不允许有null的键或者值。

批量操作

/* <p>ConcurrentHashMaps support a set of sequential and parallel bulk
 * operations that, unlike most {@link Stream} methods, are designed
 * to be safely, and often sensibly, applied even with maps that are
 * being concurrently updated by other threads; for example, when
 * computing a snapshot summary of the values in a shared registry.
 * There are three kinds of operation, each with four forms, accepting
 * functions with keys, values, entries, and (key, value) pairs as
 * arguments and/or return values. Because the elements of a
 * ConcurrentHashMap are not ordered in any particular way, and may be
 * processed in different orders in different parallel executions, the
 * correctness of supplied functions should not depend on any
 * ordering, or on any other objects or values that may transiently
 * change while computation is in progress; and except for forEach
 * actions, should ideally be side-effect-free. Bulk operations on
 * {@link Map.Entry} objects do not support method {@code setValue}.
 *
 * <ul>
 * <li>forEach: Performs a given action on each element.
 * A variant form applies a given transformation on each element
 * before performing the action.
 *
 * <li>search: Returns the first available non-null result of
 * applying a given function on each element; skipping further
 * search when a result is found.
 *
 * <li>reduce: Accumulates each element.  The supplied reduction
 * function cannot rely on ordering (more formally, it should be
 * both associative and commutative).  There are five variants:
 *
 * <ul>
 *
 * <li>Plain reductions. (There is not a form of this method for
 * (key, value) function arguments since there is no corresponding
 * return type.)
 *
 * <li>Mapped reductions that accumulate the results of a given
 * function applied to each element.
 *
 * <li>Reductions to scalar doubles, longs, and ints, using a
 * given basis value.
 *
 * </ul>
 * </ul>
 */

ConcurrentHashMap支持一系列顺序和并行批量操作,与大多数Stream方法不同,这些操作设计为即使在其他线程正在并发更新映射时也能安全(通常也合理)地应用。例如,在计算共享注册表中值的快照摘要时。共有三种操作类型,每种包含四种形式,接受以键、值、条目和(key, value)对作为参数和/或返回值的函数。由于ConcurrentHashMap的元素没有特定的排序方式,且在不同并行执行中可能以不同顺序处理,因此提供的函数正确性不应依赖于任何排序,也不应依赖于计算过程中可能临时变化的其他对象或值;除了forEach操作外,这些函数最好是无副作用的。对Map.Entry对象的批量操作不支持setValue方法。

  • forEach:对每个元素执行给定的操作。一种变体形式是在执行操作前对每个元素应用给定的转换。
  • search:对每个元素应用给定函数,返回第一个可用的非空结果;找到结果后即停止进一步搜索。
  • reduce:累积每个元素。提供的归约函数不能依赖排序(更正式地说,它应该是既结合又交换的)。共有五种变体:
    • 普通归约。(没有针对(key, value)函数参数的方法形式,因为没有对应的返回类型。)
    • 映射归约:累积对每个元素应用给定函数的结果。
    • 使用给定基值对标量double、long和int进行归约。
/* <p>These bulk operations accept a {@code parallelismThreshold}
 * argument. Methods proceed sequentially if the current map size is
 * estimated to be less than the given threshold. Using a value of
 * {@code Long.MAX_VALUE} suppresses all parallelism.  Using a value
 * of {@code 1} results in maximal parallelism by partitioning into
 * enough subtasks to fully utilize the {@link
 * ForkJoinPool#commonPool()} that is used for all parallel
 * computations. Normally, you would initially choose one of these
 * extreme values, and then measure performance of using in-between
 * values that trade off overhead versus throughput.
 */

这些批量操作接受一个parallelismThreshold参数。如果当前映射大小估计小于给定阈值,方法将顺序执行。使用 Long.MAX_VALUE值将完全抑制并行性,而使用1值将通过分解为足够多的子任务来实现最大并行性,以充分利用用于所有并行计算的 ForkJoinPool#commonPool()。通常,你会先选择这两个极端值之一,然后测量使用中间值时的性能,在开销和吞吐量之间取得平衡。

/* <p>The concurrency properties of bulk operations follow
 * from those of ConcurrentHashMap: Any non-null result returned
 * from {@code get(key)} and related access methods bears a
 * happens-before relation with the associated insertion or
 * update.  The result of any bulk operation reflects the
 * composition of these per-element relations (but is not
 * necessarily atomic with respect to the map as a whole unless it
 * is somehow known to be quiescent).  Conversely, because keys
 * and values in the map are never null, null serves as a reliable
 * atomic indicator of the current lack of any result.  To
 * maintain this property, null serves as an implicit basis for
 * all non-scalar reduction operations. For the double, long, and
 * int versions, the basis should be one that, when combined with
 * any other value, returns that other value (more formally, it
 * should be the identity element for the reduction). Most common
 * reductions have these properties; for example, computing a sum
 * with basis 0 or a minimum with basis MAX_VALUE.
 */

批量操作的并发属性继承自ConcurrentHashMap:从get(key)和相关访问方法返回的任何非空结果都与相关联的插入或更新存在happens-before关系。任何批量操作的结果都反映了这些元素关系的组合(除非映射整体已知是静止的,否则不保证对整个映射的原子性)。相反,由于映射中的键和值永远不会为null,null作为可靠的原子指示器,表示当前没有结果。为了保持这一特性,null作为所有非标量归约操作的隐式基础。对于double、long和int版本,基础值应该满足:当与其他任何值组合时,返回该其他值(更正式地说,它应该是归约的单位元)。大多数常见归约都具有这些特性;例如,使用基础0求和或使用基础MAX_VALUE求最小值。

 /* <p>Search and transformation functions provided as arguments
 * should similarly return null to indicate the lack of any result
 * (in which case it is not used). In the case of mapped
 * reductions, this also enables transformations to serve as
 * filters, returning null (or, in the case of primitive
 * specializations, the identity basis) if the element should not
 * be combined. You can create compound transformations and
 * filterings by composing them yourself under this "null means
 * there is nothing there now" rule before using them in search or
 * reduce operations.
 */

作为参数提供的搜索和转换函数应类似地返回null以表示没有结果(在这种情况下不会被使用)。对于映射归约,这也使得转换函数可以充当过滤器,如果元素不应被组合则返回null(或对于原始特化版本,返回单位元基础值)。你可以根据"null表示当前不存在任何内容"的规则,在搜索或归约操作之前自行组合这些函数来创建复合转换和过滤。

/* <p>Methods accepting and/or returning Entry arguments maintain
 * key-value associations. They may be useful for example when
 * finding the key for the greatest value. Note that "plain" Entry
 * arguments can be supplied using {@code new
 * AbstractMap.SimpleEntry(k,v)}.
 *
 * <p>Bulk operations may complete abruptly, throwing an
 * exception encountered in the application of a supplied
 * function. Bear in mind when handling such exceptions that other
 * concurrently executing functions could also have thrown
 * exceptions, or would have done so if the first exception had
 * not occurred.
 */

接受和/或返回Entry参数的方法保持键值关联。例如,在查找最大值的键时可能很有用。注意,"普通"Entry参数可以通过new AbstractMap.SimpleEntry(k,v)提供。

批量操作可能会突然完成,抛出在应用提供的函数时遇到的异常。处理此类异常时需注意,其他并发执行的函数也可能抛出异常,或者如果第一个异常没有发生,它们本也会抛出异常。

/* <p>Speedups for parallel compared to sequential forms are common
 * but not guaranteed.  Parallel operations involving brief functions
 * on small maps may execute more slowly than sequential forms if the
 * underlying work to parallelize the computation is more expensive
 * than the computation itself.  Similarly, parallelization may not
 * lead to much actual parallelism if all processors are busy
 * performing unrelated tasks.
 *
 * <p>All arguments to all task methods must be non-null.
 *
 * <p>This class is a member of the
 * <a href=" ">
 * Java Collections Framework</a >.
 */

与顺序形式相比,并行形式的加速是常见的但不保证。如果并行化计算的基础工作比计算本身更昂贵,那么在小映射上涉及简短函数的并行操作可能比顺序形式执行得更慢。类似地,如果所有处理器都在执行不相关的任务,并行化可能不会产生太多实际的并行性。

所有任务方法的所有参数都必须非null。

此类是Java集合框架的成员。

总结

1、引入ConcurrentHashMap主要是为了解决HashMap在多线程环境下的线程安全问题,并克服Hashtable因全局锁导致的性能瓶颈‌。

2、一个支持检索操作完全并发且更新操作具有高预期并发性的哈希表。所有操作都是线程安全的,但检索操作不涉及锁机制,且不支持锁定整个表以阻止所有访问。

3、检索操作反映的是在其开始时已完成的最近更新操作的结果。

4、当发生过多碰撞(即具有不同哈希码但根据表大小取模后落入同一槽位的键)时,哈希表会动态扩容。

5、像Hashtable但不像HashMap,ConcurrentHashMap不允许有null的键或者值。

6、ConcurrentHashMap 支持‌三类安全并行批量操作‌,每类包含四种形式(处理 Key/Value/Entry/(Key,Value))。

  • 批量操作分类与形式

forEach‌:对所有元素执行无副作用的遍历操作(如统计、打印)。
search‌:查找满足条件的元素(如按条件过滤)。
reduce‌:对所有元素执行聚合操作(如求和、拼接)。

  • 每类操作均支持 4 种处理维度:

仅处理 Key;
仅处理 Value;
处理 Entry(键值对);
同时处理 (Key,Value)。

ConcurrentHashMap 原理与高并发实战:从分段锁到CAS锁桶 ConcurrentHashMap 是 Java 并发编程中支撑高吞吐 Map 操作的核心数据结构,其本质是通过细粒度锁机制(如分段锁、CAS + synchronized 锁单桶)在保证线程安全的前提下极大提升并发读写性能。它基于 volatile 可见性、无锁读设计、协作式扩容等底层原理,实现了远超 Hashtable 和 SynchronizedMap 的吞吐能力。技术价值在于平衡一致性与性能,适用于缓存计数、会话管理、实时指标聚合等典型高并发场景。本文深入剖析 JDK 1.5 至 1.9 的演进逻辑 阅读详情

相关推荐

Java核心知识体系深度解析:从JVM原理到高并发实战

Java作为企业级应用开发的主流语言,其核心知识体系是每位开发者必须掌握的基础。理解JVM内存模型是掌握Java程序运行原理的关键,它定义了线程与主内存间的交互规则,直接影响程序的并发安全与性能表现。在此基础上,集合框架作为数据结构的集大成者,其设计思想与实现机制(如HashMap的负载因子与红黑树转换)深刻体现了数据结构与算法在工程实践中的权衡。深入理解这些原理,不仅能优化代码性能,更能为应对高并发场景(如ConcurrentHashMap的锁优化)和复杂系统设计打下坚实基础。本文聚焦于Java核心脉络的

weixin_30924239的博客 316

聊聊java中的哪些Map:(六)ConcurrentHashMap源码分析

文章目录1.类结构及其成员变量1.1 类的基本结构1.2 常量1.3 成员变量1.4 unsafe静态代码块2.基本原理2.1 1.7版本介绍2.1.1 1.7版本的基本组成2.1.1 1.7版本的弊端2.2 1.8版本的基本原理3.重要的内部类3.1 Node、TreeNode3.2 TreeBin3.3 ForwardingNode3.4 ReservationNode3.5 Traverser、TableStack3.6 Iterator与Spliterator3.7 Segment4.重要方法4.1

dhaibo1986的专栏 750

Java并发编程实战:JUC核心工具与高并发解决方案

并发编程是现代Java开发的核心技能,JUC(java.util.concurrent)包提供了强大的工具链来解决线程安全问题。从基础的synchronized到更高效的ReentrantLock,再到无锁编程的原子类(AtomicInteger等),这些技术通过CAS(Compare-And-Swap)机制实现线程安全操作。在高并发场景如电商秒杀系统中,JUC组件能显著提升性能,比如AtomicInteger的CAS操作比同步块快20倍。关键工具如Semaphore用于流量控制,CountDownLatc

weixin_34161032的博客 323

深入剖析Java并发编程利器:ConcurrentHashMap

在电商平台的秒杀系统中,某次促销活动遭遇了库存数据不一致的严重事故。技术团队排查发现,问题根源在于使用普通HashMap处理库存扣减时,多个线程同时修改数据导致脏读。这个真实案例揭示了并发环境下数据结构选择的重要性——ConcurrentHashMap正是为解决这类问题而生的并发容器。

阿新的博客 1202

Java高并发开发核心:JUC工具包深度解析与实战指南

并发编程是构建高性能、高可用Java应用的核心技术之一,其核心在于通过多线程机制充分利用多核CPU资源,提升系统吞吐量。其实现原理主要围绕线程安全、锁机制和线程协作展开,通过同步控制确保共享数据的一致性。在技术价值层面,良好的并发设计能显著提升系统响应速度和资源利用率,是应对高并发场景的关键。常见的应用场景包括缓存系统、订单处理、批量任务执行和连接池管理等。本文聚焦于Java并发编程的基石——JUC(java.util.concurrent)工具包,深入剖析其核心组件如ReentrantLock、Concu

weixin_30693683的博客 388

Java并发编程核心:JUC工具包深度解析与实战指南

并发编程是构建高性能、高可用Java应用的核心技术,其核心挑战在于多线程环境下对共享资源的安全访问与高效协调。Java通过内置的synchronized关键字和wait/notify机制提供了基础的同步能力,但在面对复杂的生产环境时,这些基础工具在灵活性、性能和功能上往往力不从心。为此,Java 5.0引入了java.util.concurrent(JUC)工具包,它提供了一套工业级的并发解决方案,其价值在于将开发者从基础的线程同步层面,提升到能够优雅、高效地组织大规模线程协同工作的工程实践层面。JUC的核

weixin_33834137的博客 501

深入理解ConcurrentHashMap三大原子操作:原理与实战

摘要: 本文深入探讨了ConcurrentHashMap的原子操作设计,通过computeIfAbsent方法解决并发场景下的重复初始化问题。以线程安全的用户会话缓存为例,分析了非原子操作可能导致的资源浪费和数据不一致风险,并展示了如何利用computeIfAbsent实现“首次创建、后续复用”的原子逻辑。该方法通过桶级别锁(JDK 1.8+)确保高效并发,适用于Web会话管理等需延迟初始化的场景。核心要点包括方法定义、执行原理及实战应用,强调映射函数需短时执行以避免锁竞争。

没事学AI的博客 1240

Java面试核心考点解析:从基础语法到JVM调优与高并发实战

在Java开发领域,掌握核心原理是构建稳健应用的基础。从Java语法基础到JVM内存模型,理解底层机制有助于优化程序性能与资源管理。集合框架如HashMap的扩容机制与并发安全实现,以及多线程环境下的锁优化与线程池管理,是提升系统吞吐量的关键技术。这些知识不仅在日常开发中频繁应用,更是面试中区分工程师功底的核心考点。本文聚焦于Java面试中的高频问题,深入剖析equals()与hashCode()的契约、ConcurrentHashMap的线程安全实现、以及JVM垃圾回收算法等热点话题,帮助开发者系统性地构

weixin_30878501的博客 400

Java并发编程利器:从ConcurrentHashMap到Fork/Join的奇幻之旅

ConcurrentHashMap是线程安全的哈希表实现,通过分段锁(JDK7)或CAS+synchronized(JDK8)实现高并发。JDK8版本将桶数组的每个头节点作为锁单位,显著提升吞吐量。AbstractQueuedSynchronizer构成JUC包的基础,通过CLH队列管理线程阻塞/唤醒。

2508_94032867的博客 1632

智能车八邻域图像算法_二

智能车八邻域图像算法 文章目录智能车八邻域图像算法前言一、一些想法二、生长方向的使用1.点的生长方向的表示2. 用点的生长方向来做初步判断1.引入库2.读入数据总结 前言 上一篇里面讲过用八邻域来获得赛道边界:智能车八邻域图像算法 当已经能稳定获得赛道边界时,就可以进行元素识别,获得偏差了。 这里就介绍一下我的一些思路。 早在前两年,优快云上就有一篇关于八邻域如何处理元素的文章第十五届全国大学生智能汽车竞赛-双车组三轮图像处理总结,写得很好,我当时也参考了这篇文章,但是我觉得不是很详细,所以我这里想写得

技术缝合怪的博客 1万+

apollo-慢速车向左绕行

当主车前方出现其他车辆时,通过左侧车道对前车绕行。

是菜鸟o的博客 309

ConcurrentHashMap原理与高并发优化实践

线程安全哈希表是Java并发编程的核心数据结构,通过分段锁和CAS等机制解决多线程竞争问题。ConcurrentHashMap采用分段锁(JDK7)和CAS+synchronized(JDK8)两种实现方式,在保证线程安全的同时显著提升吞吐量。其弱一致性迭代器特性特别适合缓存等读多写少场景,而compute、merge等原子操作方法简化了并发编程。在高并发系统中,合理设置initialCapacity和解决热点key问题能进一步提升性能。作为JUC包的重要组件,ConcurrentHashMap与Strea

weixin_30596343的博客 427

C#函数返回多个值实现实例

本文实例讲解C#函数返回多个值多种实现方法。

qq_30725967的博客 1170

ConcurrentHashMap computeIfAbsent,你必须掌握的高并发利器

掌握高并发编程利器,深入解析ConcurrentHashMap的computeIfAbsent方法。适用于缓存更新、线程安全计算等场景,避免竞态条件,提升性能。详解其原子性实现与使用注意事项,Java开发者值得收藏。

PoliVein的博客 349

OpenHarmony之Histreamer引擎深度解析:pipeline_core架构如何全面取代GStreamer,一统音视频播放与录制

Histreamer是OpenHarmony多媒体框架的核心媒体引擎,采用架构设计。一个轻量级的媒体引擎组件,提供播放、录制等场景的媒体数据流水线处理。1.播放场景分为如下几个节点:数据源读取、解封装、解码、输出;2.录制场景分为如下几个节点:数据源读取、编码、封装、输出。该引擎从OH5.0开始取代了原有的媒体引擎gstreamer(部分文档还保留较老架构的讲解),提供统一的音视频播放、录制、元数据解析等能力。

m0_67505153的博客 332

KEPServerEX 6 之 EX 6.11.718.0 发布说明

KEPServerEX 6.11.718.0 发布说明

-雲飛兄-博客 2880

解析Java中的ConcurrentHashMap并发编程的利器与内部机制探秘

然而在JDK 1.8中,ConcurrentHashMap进行了重大重构,放弃了分段锁设计,转而采用Node数组+链表+红黑树的数据结构,并发控制则通过CAS操作和synchronized关键字实现,进一步提升了性能。ConcurrentHashMap是Java集合框架中高性能的并发HashMap实现,它通过精巧的设计在保证线程安全的同时,提供了远高于Hashtable和SynchronizedMap的并发性能。这种方法避免了单一原子变量的争用,提高了高并发场景下的性能表现,是分而治之思想的又一体现。

zhangliangming_87的专栏 444

QMK键盘固件开发零基础教程(2025全新重制版)

《QMK键盘固件开发零基础教程(2025全新重制版)》是一套专为键盘爱好者和开发者设计的全面教程,旨在帮助用户从零基础快速掌握最新的QMK固件开发技术。教程基于2025年最新的QMK版本(0.19.8+),解决了旧版教程中的诸多问题,如概念不清、步骤缺失和代码过时等。新版教程提供了详细的图解、完整的项目源码以及从环境配置到高级功能开发的全流程指导。此外,教程还涵盖了2024年QMK生态的重大变革,包括键码系统的重构、编译工具链的更新以及Config文件格式的改变等。付费版教程额外提供独家内容,如新特性解析、

Despacito0o的博客 1119

Java集合框架深度解析:从数据结构原理到高并发实战与面试要点

数据结构是计算机科学的核心基础,它定义了数据的组织、存储和访问方式。在Java生态中,集合框架是对常用数据结构(如动态数组、链表、哈希表、树)的标准化实现,其设计深刻体现了时间与空间的权衡原理。掌握集合框架的技术价值在于,开发者能够根据数据规模、访问模式(读多写少或频繁增删)和并发需求,做出精准的技术选型,从而编写出高性能、高可维护性的代码。这在构建高并发服务、实现高效缓存以及处理大规模数据等应用场景中至关重要。例如,理解HashMap从链表到红黑树的进化,是为了应对哈希冲突导致的性能退化;而Concurr

weixin_30595035的博客 418

AD18软件——捕捉栅格、电气栅格、可见栅格的意义及设置

本文介绍了PCB设计中的三种栅格功能:可视栅格用于辅助定位(快捷键Shift+Ctrl+G),捕捉栅格控制光标移动间距(快捷键G),电气栅格实现元件自动吸附(快捷键Shift+E)。同时提供了在Altium Designer中快速查找相同网络标号的两种实用方法:Alt+鼠标单击或双击网络。这些功能可显著提高PCB设计效率和准确性。

qq_37999850的博客 643

微信小程序 - request:fail errcode:10011 cronet_error_code:0 error_msg:network change, cancel all task请求报错

微信小程序请求接口,报request:fail errcode:10011是什么原因,uniapp微信小程序request:fail errcode:10011 cronet_error_code:0 error_msg:network change, cancel all task,微信小程序wx.request常规访问接口,有个别用户的接口请求频繁报错,UniApp 微信小程序uni.request请求接口报错:request:fail errcode:10011 的原因分析与解决方案,苹果ios,安卓

🏆 前端领域优质创作者 4566

【Java并发编程实战高并发场景下的核心技术与性能优化解析】

通过`java.util.concurrent.atomic`包中的原子类(如`AtomicInteger`),利用CPU的CAS(Compare-and-Swap)指令实现无锁更新,避免锁开销。- 拒绝策略选择:根据业务需求选择`AbortPolicy`(抛出异常)、`CallerRunsPolicy`(由调用线程处理)或`DiscardPolicy`(丢弃任务)。- 减少跨线程通信:优先使用无锁队列(如`ArrayBlockingQueue`),避免频繁地`wait/notify`。

zAFSpESQ的博客 389

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java面试核心:从HashMap到高并发系统设计的深度解析与实战

在Java技术生态中,集合框架、并发编程和JVM是构建稳定、高性能应用的核心基石。理解HashMap的底层数据结构、扩容机制及线程安全原理,是掌握Java基础的关键。深入线程池的工作原理与参数调优,能有效管理资源并规避系统风险。JVM内存模型与GC机制则是性能调优和故障排查的利器,帮助开发者定位并解决OOM等线上问题。这些技术共同支撑着高并发、分布式等复杂应用场景。本文聚焦于【HashMap】与【线程池】等高频考点,通过原理剖析与场景化解读,旨在为开发者构建清晰的Java知识体系与面试应对策略。

weixin_30681615的博客 410

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

深入理解 Java ConcurrentHashMap:原理、源码与实战

是 Java 并发编程的基石之一,其精妙的设计在性能与正确性之间取得了完美平衡。理解其内部机制不仅有助于正确使用,还能在遇到性能问题时进行有效调优。JDK 8+ 采用 CAS + synchronized 锁桶,并发度更高扩容时多线程协同迁移,减少停顿时间弱一致性迭代器适合高并发遍历场景使用 compute/merge 等方法保证复合操作的原子性根据业务场景选择初始化参数,避免不必要的扩容和竞争随着 Java 版本的演进,仍在不断优化。建议在实际项目中结合性能测试,选择最适合的使用模式。

2601_96491970的博客 301

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java高并发编程核心场景解析:从实际场景到面试攻略

高并发编程是Java开发者技术体系中的重要组成部分,也是大厂面试的重点考察领域。通过深入理解这些核心场景,不仅能够解决实际开发中的问题,也能为技术成长打下坚实基础。

sheep404的博客 921

Java集合框架深度解析:从数据结构原理到高并发实战

数据结构是计算机科学的核心基础,它研究数据的组织、存储和操作方式,直接影响程序的性能和资源消耗。在Java生态中,集合框架是对常用数据结构(如数组、链表、树、哈希表)的标准化实现,其设计精髓在于时间与空间效率的权衡。理解其底层原理,例如HashMap的哈希扰动、扩容机制与红黑树优化,对于构建高性能、高可靠性的应用具有关键价值。这些技术广泛应用于缓存系统、任务调度、配置管理等场景。本文聚焦Java集合的**线程安全**实现与**性能优化**策略,深入剖析ConcurrentHashMap的CAS+synchr

weixin_34301132的博客 394
上一篇: 开发避坑指南(69):FastJSON 解析非标准 JSON 数据异常排查与解决方案
下一篇: 并发编程原理与实战(三十八)高并发利器ConcurrentHashMap 数据结构与核心API深度剖析
帧栈
博客等级 码龄2年 335粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帧栈

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值