作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个通用类,可以像这样绘制
public class Shared<T extends EntityBase> {
private HashMap<String, Class<? extends Executor<T>>> classes;
private HashMap<String, ? super Executor<T>> instances;
private List<Entity> entities;
private Compiler compiler;
// Constructor and getters
public void put(Entity entity, Source source) {
Class<?> cls = compiler.load(source);
put(entity, (Class<? extends Executor<T>>) cls );
}
private void put(Entity entity, Class<? extends Executor<T>> cls) throws IllegalAccessException, InstantiationException {
classes.put(entity.getId(), cls);
instances.put(entity.getId(), cls.newInstance());
entities.add(entity);
}
}
在我的应用程序中,此类被实例化一次,并且多个独立线程访问它。
特别是,单个线程负责写入它,并且多个线程通过 getter 访问它的实例 Map。
当我收到Source
时实例并调用 private put
方法, map 和列表都会更新。
在调试 session 中 InteliiJ
当Singleton
的框架时类退出,该类失去其状态并且两者都 Map
和 List
再次变得空虚。
我该如何解释呢?为什么Class<? extends Executor<T>>
实例和? super Executor<T>
实例丢失?
最佳答案
泛型实际上只是编译器想象力的一部分;在运行时,一切都消失了。因此,此示例中的泛型与您所看到的完全无关。
粘贴的代码无法产生您所看到的效果( map 首先更改,然后恢复)。但是,更一般地说,如果您从不同的线程调用“put”,则此代码将被破坏。没有适当的防护措施来阻止同步访问。当您从不同的线程同时更新 map 时, map 规范明确指出任何事情都可能发生(从这个意义上说, map 只是重置为空在技术上是“根据规范”,因为任何事情都是允许的,因为您没有进行线程处理)发行权)。
简单的解决方法是将第二个 put 方法标记为“同步”。
另一种策略是使用 java.util.concurrent
包中的列表和映射。但是,无论使用多少次,都无法保证类、实例和实体彼此同步。只有同步
可以做到这一点。
关于java - 具有多线程和实例共享的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54353092/
我是一名优秀的程序员,十分优秀!