我有一个带有变量和方法的类,基本上是一个实用程序类,跨多个类使用,以String格式呈现信息(secretInfo)。
基本上,根据需要,将调用实用程序类并更新secretInfo。
我尝试创建一个静态变量secretInfo,并在入口点对其进行了初始化,并在多个位置进行了更新。
上述解决方案的唯一缺点是,这可能无法在多线程环境中使用,我想避免创建静态变量。
有没有一种方法可以避免创建静态变量,同时可以跨多个位置访问实用程序对象,而无需将对象引用从一个位置传递到另一个位置,同时确保它可以在多线程环境中工作。
公共类secretInfoUtility {
public static HashMap<String, String> secretInfo;
public static String renderInfo(HashMap<String, String> secretInfo) {
//secretInfo gets updated here
}
}
注意-想法是使该实用程序类与其他类保持松散耦合。
最佳答案
如果这是不可变的,那就这样做。尽可能选择不变性。在这种情况下,您要避免的问题是由于多个线程之间共享资源的更改而导致内存不一致。您可以通过与共享资源创建事前发生关系来做到这一点。在这种情况下,共享资源是一个Map,可以是ConcurrentHashMap,它将确保所有读取和写入在内部进行同步。
public final class SecretInfo {
private final ConcurrentMap<String, String> secretInfo;
public SecretInfo(ConcurrentMap<String, String> secretInfo) {
this.secretInfo = secretInfo;
}
public String reder() {
// convert map to String, doesnt need to be synchronized
}
public void update(Map<String, String> update) {
// atomically update the map
}
}
public class SecretInfoService {
private final SecretInfo secretInfo;
public SecretInfoService(SecretInfo secretInfo) {
this.secretInfo = secretInfo;
}
public SecretInfo getSecretInfo() {
return secretInfo;
}
}
用法示例;
class MyEntryPoint {
public static void main(String... args) {
ConcurrentMap<String, String> info = new ConcurrentHashMap<>();
info.put("hello", "world");
info.put("foo", "bar");
SecretInfoService service = new SecretInfoService(new SecretInfo(info));
ClassWithServiceDependency clazz = new ClassWithServiceDependency(service);
}
static final class ClassWithServiceDependency {
private final SecretInfoService service;
private ClassWithServiceDependency(SecretInfoService service) {
this.service = service;
}
void render() {
String rendered = service.render();
}
}
}