小编bit*_*it9的帖子

用volatile更新和交换HashMap

背景

我有一个大的数据映射(HashMap),保存在内存中,并由后台线程进行增量更新(基于传入消息):

<KEY> => <VALUE>
...
Run Code Online (Sandbox Code Playgroud)

最终用户将通过REST API查询它:

GET /lookup?key=<KEY>
Run Code Online (Sandbox Code Playgroud)

一旦收到特殊控制消息,即不会立即应用更新,而是分批进行更新,即

MESSAGE: "Add A" 

A=<VALUE>   //Not visible yet

MESSAGE: "Add B"

B=<VALUE>   //Not visible yet

MESSAGE: "Commit"

//Updates are now visible to the end-users
A=<VALUE>
B=<VALUE
Run Code Online (Sandbox Code Playgroud)

我设计的架构如下:

<KEY> => <VALUE>
...
Run Code Online (Sandbox Code Playgroud)

问题

将write-> read写入volatile字段会在边缘之前发生:

在随后每次对该字段进行读取之前,都会写入一个易失字段(第8.3.1.4节)。

https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5

并且正确选择了宽限期,我希望在交换之后,最终用户请求(一次全部)将看到对任何应用到PassiveCopy(通过putAll())的更新。

确实是这样,还是有什么极端情况会使这种方法失败?

注意

我知道创建Map的副本(以便每次都将一个新的Map实例分配给activeCopy)是安全的,但是我不想这样做(因为它确实很大)。

java volatile

5
推荐指数
1
解决办法
104
查看次数

标签 统计

java ×1

volatile ×1