gpt4 book ai didi

Java 安全多线程

转载 作者:行者123 更新时间:2023-12-02 01:00:10 26 4
gpt4 key购买 nike

我有几个关于多线程的问题(我想安全快速地完成我的小项目)。

我有一个类库。我会将用户请求添加到文件中。

public static volatile HashMap<String, GooglePlayGame> games = new HashMap<>(500);

在每个应用程序启动时,我使用静态 block 中的文件(json+Jackson)初始化此 HashMap :

static {
TypeFactory typeFactory = mapper.getTypeFactory();
MapType mapType = typeFactory.constructMapType(HashMap.class, String.class, GooglePlayGame.class);
try {
games = mapper.readValue(new File("games.json"), mapType);
} catch (IOException e) {
log.error(e.getMessage());
}
}

每个用户的请求(使用特殊命令/library)将被处理,然后新的“键值”对将被添加到全局 HashMap 中,当然如果键不存在(使用 containsKey 检查)。然后使用这个 HashMap (不是来自文件)。

然后我想将新的对写入我的文件中。为此我想创建一个新线程,如下所示:

Thread thread = new Thread(() -> {
try {
mapper.writeValue(new File("games.json"), games);
} catch (IOException e) {
e.printStackTrace();
}
});
thread.start();

问题:

1)“不稳定”有帮助吗?它是否保证在写入文件时我将始终看到所有最后添加的对?

2)如果..怎么办?写入文件不是每对新的,而是每 10 对新的?这个怎么做?使用 CountDownLatch?如果是,如何正确组织?我不太擅长多线程。但是如果程序崩溃并且我收到 9 个新请求怎么办,这些对将会丢失!

3) 顺便问一下,我是在这里创建一个新文件还是只是覆盖旧文件?如果我总是创建新文件,这有点糟糕。 Jackson 创建新文件还是覆盖旧文件?

最佳答案

1) 在这种情况下,volatile 关键字不会给您带来期望的结果。当您搜索它的作用时,它可能会有点误导。您可以发现“ volatile 关键字保证对变量的所有写入对所有线程都可见”。这意味着当您为变量分配新值(新对象)时,它将是可见的。但是,如果更改分配给该变量的对象,这些更改不一定对所有线程都可见。

在您的情况下,您修改了 HashMap 而不是变量,因此它可能不可见。您应该考虑使用一些线程安全的专用内置集合,例如 ConcurrentHashMap

2) 您无法真正确保在崩溃时所有数据都会写入文件。在每次输入后写入数据总是更安全,但这取决于发生的频率。如果是一分钟一次,那么当时写 1 次就可以了,如果是每秒数千次,那么你应该考虑批量写入。

3)我认为自己测试一下应该很容易。另外,它与有关多线程的主要问题并不真正相关。

关于Java 安全多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60772230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com