- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
@Singleton
@LocalBean
@Startup
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class DeliverersHolderSingleton {
private volatile Map<String, Deliverer> deliverers;
@PostConstruct
private void init() {
Map<String, Deliverer> deliverersMod = new HashMap<>();
for (String delivererName : delivererNames) {
/*gettig deliverer by name*/
deliverersMod.put(delivererName, deliverer);
}
deliverers = Collections.unmodifiableMap(deliverersMod);
}
public Deliverer getDeliverer(String delivererName) {
return deliverers.get(delivererName);
}
@Schedule(minute="*", hour="*")
public void maintenance() {
init();
}
}
单例用于存储数据。数据每分钟更新一次。从 unmodifiableMap 中读取是否有可能是同步问题?是否有可能会在 init 方法中发生重新排序并发布到集合的链接,但集合未完全填充?
最佳答案
Java 内存模型保证 there is a happens-before relationship between a write and a subsequent read to a volatile variable .换句话说,如果你写入一个 volatile 变量并随后读取同一个变量,你可以保证写入操作是可见的,即使涉及多个线程也是如此:
A write to a volatile field (§8.3.1.4) happens-before every subsequent read of that field.
它更进一步并保证在写入操作之前发生的任何操作在读取点也将是可见的(由于程序顺序规则和 happens-before 关系是可传递的事实).
您的 getDeliverers
方法从 volatile 变量读取,因此它将看到在行 deliverers = Collections.unmodifiableMap(deliverersMod);
以及前面的行上进行的最新写入操作填充 map 的操作。
因此您的代码是线程安全的,并且您的 getDeliverers
方法将根据最新版本的 map 返回结果。
关于java - 并发访问unmodifiableMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17472280/
看着java.util.Collections.unmodifiableMap实现(OpenJDK 11): /** * Returns an unmodifiable view o
我从一个方法返回一个不可修改的映射。我如何确保任何试图修改返回映射的代码都会出现编译时错误,而不是运行时错误? 我的类(class): public class Foo { private f
这更像是一个好奇心问题。假设我为 Collections.unmodifiableMap() 提供了一个访问顺序设置为 true 的 LinkedHashMap。由于读取实际上是在修改 map 。这是
Colelction.unmodifiableMap 是否保护迭代顺序? 我正在尝试 newMap.put(key,Collections.ModifiableMap(oldMap))然后,当我执行
我有一个 hashmap其中包含大约一千个条目。现在我必须以无法在类外修改的方式公开它。所以我这样写 public static Map getResponseCodeSource() { r
所以我是 Hadoop 和 MapReduce 的新手,正在尝试创建一个简单的 WordCount 程序。但是,在运行它时,我遇到了一个错误: Exception in thread "main" j
我最近在阅读Java Concurrency in Practice,第一次接触到Collections.unmodifiableMap(...) 方法。该方法围绕现有 Map 创建一个只读包装器,任
我刚刚收到以下堆栈跟踪: 2015-12-20 07:43:36.151 -0800 ERROR o.s.s.s.TaskUtils$LoggingErrorHandler [taskExecutor
这个问题在这里已经有了答案: Immutable vs Unmodifiable collection [duplicate] (11 个回答) 关闭8年前。 上下文 我需要返回对我用于数据缓存的 m
在查看源代码时,我可以看到 stream()方法已在 Collections.UnmodifiableMap.UnmodifiableEntrySet 中被覆盖.但代码似乎与 Collection.s
我有一个引用: public final static LinkedHashMap> DELEGATES; 我初始化如下: static { LinkedHashMap> tmp = new
我正在尝试将参数映射从 ServletRequest 转换为 Scala 2.9.0.1 中的 Scala Map: val params = request.getParameterMap.asIn
Java 的 Collections.unmodifiableList 和 Collections.unmodifiableMap 在 Ruby 标准 API 中是否有等价物? 最佳答案 使用free
我打算使用 unmodifiableMap来自 Collections 类的 API。 我正在使用此 API 来限制其他类修改我的父 Map 对象。 我知道这个 API 比创建 Map 的新副本要好,
当我尝试使用 StepExecutionContext 在步骤之间共享数据时遇到此错误。我对这个框架非常陌生,所以我希望这是一个简单的问题,但据我所知,它一定在框架上,因为我没有在任何地方使用“Unm
我是一名优秀的程序员,十分优秀!