gpt4 book ai didi

java - 使用Java ReadWriteLock同步缓存数据——是否将状态变量标记为 volatile ?

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

ReadWriteLock javadoc at Oracleits implementation描述锁的作用以及如何使用它,但没有说明是否使用 volatile 关键字。

这与 do-all-mutable-variables-need-to-be-volatile-when-using-locks 不是同一个问题因为我很高兴锁能够正确同步访问和可见性,但是对变量使用 volatile 仍然是一个好主意,例如出于编译器优化或任何其他原因?

我的缓存数据由一个很少更改的List和几个使用对象的各种属性映射列表中的对象的Map组成。

private void reload() {
Set<Registration> newBeans = dao.listRegistered();
beans = Collections.unmodifiableSet(newBeans);
codeToBeanMap.clear();
userToBeanMap.clear();
nameToBeanMap.clear();
idToBeanMap.clear();
for (Registration bean : newBeans) {
codeToBeanMap.put(bean.getCode(), bean);
userToBeanMap.put(bean.getUser(), bean);
nameToBeanMap.put(bean.getName(), bean);
idToBeanMap.put(bean.getId(), bean);
}
}

最好的声明是什么?我有这个:

private Set<Registration> ecns;
private final Map<String, Registration> codeToBeanMap =
new HashMap<String, Registration>();
private final Map<String, Registration> userToBeanMap =
new HashMap<String, Registration>();
private final Map<String, Registration> nameToBeanMap =
new HashMap<String, Registration>();
private final Map<String, Registration> idToBeanMap =
new HashMap<String, Registration>();

最佳答案

如果您要从受锁保护的代码中专门访问变量,那么将该变量指定为 volatile 将是多余的,并且会导致一定的性能损失(在纳秒范围内) )。

关于java - 使用Java ReadWriteLock同步缓存数据——是否将状态变量标记为 volatile ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28297406/

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