gpt4 book ai didi

java - 正确使用 volatile 关键字

转载 作者:行者123 更新时间:2023-11-30 05:12:14 25 4
gpt4 key购买 nike

我认为我对 java 中的 volatile 关键字有一个很好的想法,但我正在考虑重构一些代码,并且我认为使用它是一个好主意。

我有一个类,它基本上用作数据库缓存。它保存一堆从数据库读取的对象,为这些对象提供请求,然后偶尔刷新数据库(基于超时)。这是骨架

public class Cache
{
private HashMap mappings =....;
private long last_update_time;
private void loadMappingsFromDB()
{
//....
}
private void checkLoad()
{
if(System.currentTimeMillis() - last_update_time > TIMEOUT)
loadMappingsFromDB();
}
public Data get(ID id)
{
checkLoad();
//.. look it up
}
}

所以担心 loadMappingsFromDB 可能是一个高延迟操作,这是 Not Acceptable ,所以最初我认为我可以在缓存启动时启动一个线程,然后让它 hibernate ,然后在后台更新缓存。但随后我需要同步我的类(class)(或 map )。然后我只是用偶尔的大停顿来让每次缓存访问变慢。

然后我想为什么不使用 volatile

我可以将 map 引用定义为 volatile

private volatile HashMap mappings =....;

然后在get(或使用映射变量的其他任何地方)中,我只需制作引用的本地副本:

public Data get(ID id)
{
HashMap local = mappings;
//.. look it up using local
}

然后后台线程将加载到临时表中,然后交换类中的引用

HashMap tmp;
//load tmp from DB
mappings = tmp;//swap variables forcing write barrier

这种方法有意义吗?它真的是线程安全的吗?

最佳答案

此问题的现有答案中存在一些错误信息。使用 volatile 实际上是确保线程安全的一个很好的步骤。请参阅item 3 in Dispelling Java programming language myths作者:IBM 的 Peter Haggar。 Haggar 提供了一些背景知识和示例,但要点是:

So, how can atomic operations not be thread safe? The main point is that they may indeed be thread safe, but there is no guarantee that they are. Java threads are allowed to keep private copies of variables separate from main memory.

通过使用 volatile ,您将保证线程引用主内存,而不是使用您不知道或不期望的变量的私有(private)副本。

要回答您的问题,那么:是的,您的策略是安全的。

编辑:
在回复另一篇文章时,这里是 the JLS section about volatile fields .

关于java - 正确使用 volatile 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3016318/

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