所以我有一个 SomeTask
类,它扩展了 Thread
,并且它具有 Map
和 List
字段。当您不执行 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/