这段代码是线程安全的吗?

2024-02-01

我想处理客户请求流。每个请求都有其特殊类型。首先,我需要初始化该类型的一些数据,然后我可以开始处理请求。当客户端类型第一次来的时候,我只是初始化相应的数据。此后,将使用该数据处理该类型的所有后续请求。

我需要以线程安全的方式执行此操作。

这是我写的代码。它是线程安全的吗?

public class Test {

    private static Map<Integer, Object> clientTypesInitiated = new ConcurrentHashMap<Integer, Object>();

    /* to process client request we need to 
    create corresponding client type data.
    on the first signal we create that data, 
    on the second - we process the request*/

    void onClientRequestReceived(int clientTypeIndex) {
        if (clientTypesInitiated.put(clientTypeIndex, "") == null) {
            //new client type index arrived, this type was never processed
            //process data for that client type and put it into the map of types
            Object clientTypeData = createClientTypeData(clientTypeIndex);
            clientTypesInitiated.put(clientTypeIndex, clientTypeData);
        } else {
            //already existing index - we already have results and we can use them
            processClientUsingClientTypeData(clientTypesInitiated.get(clientTypeIndex));
        }
    }

    Object createClientTypeData(int clientIndex) {return new Object();}

    void processClientUsingClientTypeData(Object clientTypeData) {}
}

一方面,ConcurrentHashMap 无法为同一个 A 生成两次 map.put(A,B) == null 。 另一方面,赋值和比较操作不是线程安全的。

那么这段代码可以吗? 如果没有,我该如何修复它?

更新: 我接受了 Martin Serrano 的回答,因为他的代码是线程安全的,并且不容易出现双重初始化问题。但我想指出的是,我没有发现我的版本有任何问题,作为答案发布在下面,并且我的版本不需要同步。


不,我不认为它仍然是线程安全的。

您需要将 put 操作包装在同步块中。

As per ConcurrentHashMap 的 javadoc http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html

检索操作(包括 get)通常不会阻塞,因此可能与更新操作(包括 put 和 remove)重叠。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这段代码是线程安全的吗? 的相关文章

  • 我需要在 Spring 中检查每个控制器中的有效会话吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设在 Spring Mvc 的 Web 应用程序中 我们是否需要检查每个控制器或 jsps 中的有效会话 我该如何解决 MVC 中的
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • 在 C# 中创建加密随机数的最快、线程安全的方法?

    请注意 在多个线程上并行生成随机数时 加密随机数生成器不是线程安全的 使用的发电机是RNGCryptoServiceProvider它似乎重复了很长一段随机位 128 位 重现此情况的代码如下所示 缺乏使用锁来保护访问RNGCryptoSe
  • 如何在 Java 中禁用 System.out 以提高速度

    我正在用 Java 编写一个模拟重力的程序 其中有一堆日志语句 到 System out 我的程序运行速度非常慢 我认为日志记录可能是部分原因 有什么方法可以禁用 System out 以便我的程序在打印时不会变慢 或者我是否必须手动检查并
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个

随机推荐

  • django 模板中的逗号分隔列表

    If fruits是列表 apples oranges pears 有没有一种使用 django 模板标签快速生成 苹果 橙子和梨 的方法 I know it s not difficult to do this using a loop
  • 如何处理函数数组中的重复函数调用?

    我正在尝试按顺序执行以下函数 同步 异步 数组 避免callbackHell 实现函数runCallbacksInSequence 我需要实现自己的函数来了解回调的工作原理并避免使用 Async js 这是我到目前为止所拥有的 功能runC
  • 在 pandas 数据框替换功能中使用正则表达式匹配组

    我刚刚学习 python pandas 喜欢它的强大和简洁 在数据清理期间 我想使用正则表达式对数据框中的列进行替换 但我想重新插入匹配的部分 组 简单示例 姓氏 名字 gt 名字 姓氏 我尝试了类似以下的内容 实际情况更复杂 所以请原谅简
  • Hyperledger Fabric 了解 MSP

    我想清楚MSP的用途 所以我的问题是 当用户出于任何原因想要使用某个通道时 本地 MSP 会为其提供一个带有私钥的身份 在文档中说 MSP 有一个密钥库 并且在通道确认用户使用该通道 MSP 后 CA何时参与 None
  • 查询字符串是否有类似 hashchange 的事件?

    我一直在使用哈希值在页面之间传递数据 例如设置scrollTop 等 并且还使用了hashChange触发给定页面上的更改的事件 然而 哈希值具有我不一定感兴趣的默认行为 例如使页面跳转到给定的 有时是无关紧要的 位置 我觉得获取 设置查询
  • 游戏路径寻找

    所有类型的游戏中都使用哪些路径查找算法 无论如何 在角色移动的所有类型中 迪杰斯特拉 Dijkstra 曾经被使用过吗 我并不是真的想编写任何代码 只是做一些研究 不过如果你粘贴伪代码或其他东西 那就没问题了 我可以理解 Java 和 C
  • Spyder互动剧情:等待剧情关闭继续

    我使用 Spyder 在 Windows 上工作 使用 matplotlib 进行绘图 我的问题是我想要进行交互式绘图 或者有时绘制很多东西 并且我希望spyder等待我关闭图形以继续代码 与传统终端相同的方式 我试过 plt ion mp
  • Linux 中的堆栈内存管理

    我有几个与 Linux 堆栈大小限制相关的问题 我对 x86 64 系统最感兴趣 但如果存在平台差异 我也想了解它们 我的问题是 1 Linux如何动态增加堆栈的大小 我编写了一个带有递归函数 以使用堆栈空间 的测试程序 我可以在其中指定迭
  • 在 Django 中,如何覆盖“保存并继续”功能?

    我需要向 ModelAdmin 添加一些保存前和保存后逻辑 但仅当用户通过 保存并继续编辑 按钮而不是 保存 按钮提交表单时 我怎样才能做到这一点 就像重写普通的保存方法一样 您需要重写save model ModelAdmin 中的函数
  • 将所有相对 URL 替换为绝对 URL

    我看过一些答案 比如this one https stackoverflow com questions 31347340 convert all relative urls to absolute urls while maintaini
  • 将 textGrob 转换为 imageGrob/rasterGrob?

    如果这非常简单 我深表歉意 其实我希望会是这样 我正在尝试从文本动态创建图像 然后可以调整图像的大小并绘制 拉伸或挤压 以生成主题类型的图表 我开始使用图像 我使用生成的png and ggplot 并将它们绘制为annotation cu
  • 追加内的 for 循环不起作用

    下面是我的代码 table table cellspacing 0 cellpadding 0 border 0 width 100 append append function options ONE TWO THREE FOUR eac
  • SSIS:如何在数据流任务中运行存储过程

    我有一个执行此操作的数据流任务 从 OLE DB 源中 运行 SQL 命令来选择一些数据 查找不同的 SQL DB 源 检查数据是否已存在 根据查找匹配输出与查找不匹配输出 使用不同的输入参数运行存储过程 输入参数将基于 2 中的 可用查找
  • 在Mac OS X系统上快速创建大文件?

    为了创建 10 GB 临时文件 在 Linux 中你可以这样做 fallocate l 10G temp 10GB file 在 Windows 中 您可以执行以下操作 fsutil file createnew temp 10GB fil
  • Prolog 检查列表中的第一个元素是否不相等且列表中的第二个元素是否相等

    我想比较两个列表 第一个元素不应该相等 第二个元素应该相等 示例数据库 likes josh muse likes sam muse likes josh gnr likes sam radiohead 所以它应该为 same josh m
  • 当应用程序在后台时广播接收器

    我正在尝试编写一个应用程序 其中我根据使用 gcm 推送通知发送的消息对 UI 进行更改 并且我设法通过使用 BroadcastReceiver onReceive 函数来实现它 但它仅在应用程序位于前台时才有效 但如果它在后台或关闭 没有
  • decltype(void()) 中的 void() 是表达式还是函数类型?

    这是后续的this https stackoverflow com questions 39278200 is sizeofvoid a legal expression问题 更准确地说是评论this https stackoverflow
  • Spring Boot 2.0.0 + OAuth2

    Spring Boot 2 Spring Security OAuth2 是否仍然支持 AuthorizationServer注解 通过阅读发行说明 有些内容尚未移植 Oauth2 支持 https github com spring pr
  • 是否可以使用可靠的仅 javascript 上传文件

    我想要一种可靠的方式来上传文件 这意味着我希望能够处理中断 错误和暂停 所以我的问题是 是否可以仅在客户端上使用 javascript 进行类似以下操作 如果是这样 我想要指向库 教程 书籍或实现的指针 如果不是 我想解释为什么这是不可能的
  • 这段代码是线程安全的吗?

    我想处理客户请求流 每个请求都有其特殊类型 首先 我需要初始化该类型的一些数据 然后我可以开始处理请求 当客户端类型第一次来的时候 我只是初始化相应的数据 此后 将使用该数据处理该类型的所有后续请求 我需要以线程安全的方式执行此操作 这是我