Java - 避免将对象引用传递到多个位置,同时确保其线程安全

标签 java class oop design-patterns

我有一个包含变量和方法的类,它基本上是一个跨多个类使用的实用程序类,用于以字符串格式呈现信息(secretInfo)。

基本上,根据需要,调用实用程序类并更新secretInfo。

我尝试创建一个静态变量secretInfo,并在入口点初始化该变量并在多个位置更新。

上述解决方案的唯一缺点是这可能不适用于多线程环境,我想避免创建静态变量。

有没有一种方法可以避免创建静态变量,同时可以跨多个位置访问实用程序对象,而无需将对象引用从一个位置传递到另一个位置,同时确保它在多线程环境中工作。

公共(public)类secretInfoUtility {

public static HashMap<String, String> secretInfo;


public static String renderInfo(HashMap<String, String> secretInfo) {

    //secretInfo gets updated here

}

}

注意 - 想法是使该实用程序类与其他类松散耦合。

最佳答案

如果这可能是不可变的,那么就这样做。尽可能选择不变性。在这种情况下,您要避免的问题是由于多个线程之间共享资源的更改而导致内存不一致。您可以通过创建与共享资源的happens-before关系来做到这一点。在这种情况下,共享资源是一个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();
        }

    }

}

关于Java - 避免将对象引用传递到多个位置,同时确保其线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61782621/

相关文章:

java - 快捷键,Java

c++ - "used without template parameters"

java - 什么需要更多内存 - 嵌套类/单独类

php - 从 UML 类图生成 PHP 类的软件

java:确保该类型只有一个实例

java - try catch 异常 while 循环

java - 安卓 : When app close do something

java - 即使找到 Maven 依赖项,Intellij 也无法解析符号 RunWith

javascript - 将 .apply() 与 'new' 运算符一起使用。这可能吗?

java - 面向对象设计 : Which is better practice?