iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java的ConcurrentHashMap中不能存储null的原因解析
  • 895
分享到

Java的ConcurrentHashMap中不能存储null的原因解析

2024-04-02 19:04:59 895人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、先出源码出发二、那么究竟这是为什么呢?三、ConcurrentHashMap 作者 Doug Lea 的邮件众所周知,在Java中Map可以存储null,而Concurren

众所周知,在Java中Map可以存储null,而ConcurrentHashMap不能存储null值,那么为什么呢?

一、先出源码出发

put方法点进去~

@throws NullPointerException if the specified key or value is null and this map does not permit null keys or values

可以清晰的看到源码中规定,ConcurrentHashMap是不可以存储null值的。

二、那么究竟这是为什么呢?

可以先具体的了解一下ConcurrentHashMap。

与HashMap一样,ConcurrentHashMap也是一个基于散列的Map,但它使用了一种完全不同的加策略来提供更高的并发性和伸缩性。ConcurrentHashMap并不是将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器,而是使用一种更细的加锁机制来实现更大程度的共享,这种机制成为分段锁。在这种机制中,任意数量的读取线程可以并发地访问Map,执行读取操作的线程和执行写入操作的线程可以并发地访问Map,并且一定数量的写入线程可以并发地修改Map。ConcurrentHashMap带来的结果是,在并发访问环境下将实现更高的吞吐量,而在单线程环境中只损失非常小的性能。

ConcurrentHashMap返回的迭代器具有弱一致性,而并非“及时失败”。弱一致性的迭代器可以容忍并发的修改,当创建迭代器时会遍历已有的元素,并可以在迭代器被构造后将修改操作反映给容器。ConcurrentHashMap返回的迭代器具有弱一致性,而并非“及时失败”。弱一致性的迭代器可以容忍并发的修改,当创建迭代器时会遍历已有的元素,并可以在迭代器被构造后将修改操作反映给容器。

三、ConcurrentHashMap 作者 Doug Lea 的邮件

对于 ConcurrentHashMap 不允许插入 null 值的问题,有人问过 ConcurrentHashMap 的作者 Doug Lea,以下是他回复的邮件内容:

The main reason that nulls aren’t allowed in ConcurrentMaps
(ConcurrentHashMaps, ConcurrentSkipListMaps) is that ambiguities that
may be just barely tolerable in non-concurrent maps can’t be
accommodated. The main one is that if map.get(key) returns null, you
can’t detect whether the key explicitly maps to null vs the key isn’t
mapped.In a non-concurrent map, you can check this via
map.contains(key),but in a concurrent one, the map might have changed
between calls.Further digressing: I personally think that
allowingnulls in Maps (also Sets) is an open invitation for programsto
contain errors that remain undetected untilthey break at just the
wrong time. (Whether to allow nulls evenin non-concurrent Maps/Sets is
one of the few design issues surroundinGCollections that Josh Bloch
and I have long disagreed about.)It is very difficult to check for
null keys and valuesin my entire application .Would it be easier to
declare somewherestatic final Object NULL = new Object();and replace
all use of nulls in uses of maps with NULL?

-Doug

以上信件的主要意思是,Doug Lea 认为这样设计最主要的原因是:不容忍在并发场景下出现歧义!

到此这篇关于Java的ConcurrentHashMap中不能存储null的原因解析的文章就介绍到这了,更多相关Java ConcurrentHashMap不能存储null内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java的ConcurrentHashMap中不能存储null的原因解析

本文链接: https://www.lsjlt.com/news/164712.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java的ConcurrentHashMap中不能存储null的原因解析
    目录一、先出源码出发二、那么究竟这是为什么呢?三、ConcurrentHashMap 作者 Doug Lea 的邮件众所周知,在Java中Map可以存储null,而Concurren...
    99+
    2024-04-02
  • Java7和Java8中的ConcurrentHashMap原理解析
    目录Java7 中 ConcurrentHashMap初始化put 过程分析初始化槽: ensureSegment获取写入锁: scanAndLockForPut扩容: rehash...
    99+
    2024-04-02
  • JAVA与SQL 中的null与NULL解析
    目录一、前言看下面我做的一个简单的测试:二、Java中的null引发这个异常的情况有:2.1 大小写2.2 默认的初值2.3 类型2.4 对null的检查== 与 !=instanc...
    99+
    2024-04-02
  • Java中ThreadLocal 导致内存 OOM 的原因分析
    目录原因分析正确的使用方式原因分析 ThreadLocal 导致内存 OOM 的原因是什么? ThreadLocal 底层通过 ThreadLocalMap 存储数据 源码如下:&n...
    99+
    2024-04-02
  • Java 报错 java.util.ConcurrentModificationException: null 的原因和解决方案
    Java 报错 java.util.ConcurrentModificationException: null 的原因和解决方案 简介: 在 Java 编程中,当使用迭代器或者增强型 for 循环遍历...
    99+
    2023-09-09
    java 开发语言
  • Win11改不了存储位置的原因有哪些
    Win11改不了存储位置的原因可以有以下几个:1. 系统限制:Windows 11可能对特定的系统文件或文件夹设置了限制,不允许用户...
    99+
    2023-09-29
    Win11
  • Java并发指南13:Java 中的 HashMap 和 ConcurrentHashMap 全解析
    本文转自:https://www.javadoop.com/本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦...
    99+
    2023-06-02
  • mysql的Buffer Pool存储及原理解析
    目录一、前言1、buffer pool是什么2、buffer pool的工作流程3、buffer pool缓冲池和查询缓存(query cache)二、buffer pool的内存数...
    99+
    2024-04-02
  • mysql中InnoDB是默认存储工具的原因
    小编给大家分享一下mysql中InnoDB是默认存储工具的原因,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!以主流的MyISAM和InnoDB的对比1.功能对比InnoDB支持ACID的事务4个特性,而MyISAM不支持;...
    99+
    2023-06-14
  • 【Mybatis-plus】updateById()方法不能更新字段为null的原因及解决办法
    【Mybatis-plus】updateById()方法不能更新字段为null的原因及解决办法 一、问题描述 ​ 在日常项目开发过程中,经常会使用Mybatis-plus的updateById()方法...
    99+
    2023-09-02
    mybatis java spring
  • win7内存不能为written的原因有哪些
    Win7内存不能被written的原因可能包括:1. 内存故障:内存模块可能存在硬件故障,如损坏、松动或不兼容等,导致无法被写入。2...
    99+
    2023-09-05
    win7
  • 什么叫云服务器储存空间不足的原因
    存储容量不足:如果您的云服务器无法存储您需要的文件或数据,则可能是因为存储容量不足。您可以尝试升级您的硬盘或扩展云存储容量以增加存储空间。 网络连接问题:如果您的服务器连接不稳定或速度较慢,可能会导致存储空间不足。您可以尝试使用稳定的网络...
    99+
    2023-10-28
    什么叫 原因 服务器
  • 浅析php $_cookie值与存入值不同的原因
    在使用PHP $_COOKIE获取cookie值时,有时候可能会遇到获取到的值与存入的值不同的情况,这时候我们需要对代码进行一些调试和检查。下面将介绍一些可能导致获取的cookie值与存入的值不同的原因。变量名不一致由于cookie本身是一...
    99+
    2023-05-14
    php cookie
  • 云原生存储中的容器存储与 K8s 存储卷怎么理解
    本篇文章为大家展示了云原生存储中的容器存储与 K8s 存储卷怎么理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。云原生存储的两个关键领域:Docker 存储卷、K8s 存储卷;Docker 存储卷...
    99+
    2023-06-04
  • java的ReentrantReadWriteLock不能锁升级的原因是什么
    本篇内容介绍了“java的ReentrantReadWriteLock不能锁升级的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为...
    99+
    2023-06-20
  • css中不能正常加载的原因
    小编给大家分享一下css中不能正常加载的原因,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是csscss是一种用来表现HTML或XML等文件样式的计算机语言,...
    99+
    2023-06-14
  • Java不能真正泛型的原因是什么?
    目录简单来回顾一下类型擦除,看下面这段代码。为什么 Java 不能实现真正意义上的泛型呢?背后的原因是什么?第一,兼容性第二,不是“实现不了”总结简单来回顾一下类型擦除,看下面这段代...
    99+
    2024-04-02
  • 浅析sublime text不能运行php的原因和解决方法
    SublimeText是一款非常流行的代码编辑器,它广泛应用于开发人员和编写代码的工作之中。在下面的文章中,我们将讨论SublimeText不能运行PHP的原因和解决方法。一、原因分析SublimeText不能运行PHP是因为它本身不是一个...
    99+
    2023-05-14
    php sublime text sublime
  • 协程存在的原因,及能解决的问题
    一、提高CPU利用率 协程可以在单线程的情况下实现多任务调度,大大提高了CPU的利用率。因为协程的切换开销小于线程切换,减少了大量无用的CPU消耗,从而提高了系统的整体效率。 二、简化异步编程模型 协程是一种更简单的异步编...
    99+
    2023-10-29
    原因
  • linux中网络不能的原因有哪些
    网络配置错误:例如IP地址、子网掩码、网关等配置不正确,导致网络无法正常通信。 DNS解析问题:如果DNS服务器无法解析域名,也会...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作