Java并发: should I synchronize all List and Maps?

标签 java concurrency

所以我有一个 SomeTask 类,它扩展了 Thread,并且它具有 MapList 字段。当您不执行 Collections.synchronizedXXX 并且您有多个线程运行 SomeTask 时,会出现什么行为?

一旦从数据库调用Map(我使用对象数据库直接存储POJO),我是否还需要同步从该数据库返回的Map对象?

Map SomeTasksOwnMap = Collections.synchronizedMap(MapReturnedFromDatabase);

最佳答案

Collections.synchronizedXXX 当 2 个或更多线程访问同一个 Map/List 时需要。

如果您的任务不访问其他任务Map/List,则无需同步它们。

示例。

  • 任务 1 构建一个能被 2 整除的数字列表。
  • 任务 2 构建一个能被 3 整除的数字列表。

这两个任务具有不需要同步的单独列表。

示例需要同步。

  • 任务 1 和 2 都计算数字并将其存储在共享列表中。

要回答以下问题:“如果不这样做,会出现什么行为”,如果两个线程都想写入索引“x”,则可能会丢失其中一个写入。

列表中也可能有空值,因为在写入该位置之前数组的大小已增加。

基本上你会得到不一致的 View 。

关于Java并发: should I synchronize all List and Maps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9695574/

相关文章:

java - Mockito when()...then() NullPointerException

java - 为什么同步方法在我的情况下不起作用(或者更确切地说我的假设有什么问题)?

java - 在 Object.wait() 之前调用 Object.notify()

java - 使用java流判断一个数是否为素数

java - 在 SPRING 中设置 ValidationMessages.properties 的路径

java - 代码删除整个文件而不是修改我想要的 Java 行

go - go-routines的协调和优雅的关闭

multithreading - 互斥条件

concurrency - go例程中的执行顺序

java - 什么是适合 Java EE 应用程序的二级缓存?