即将发布的Java应用程序代码具有以下结构(在很多地方都存在)。在应用程序上下文加载期间,该类仅加载一次。以前工作正常。但是,当转移到具有多个线程的回归环境时,由于共享成员变量,这将导致并发问题。

Class A {

    private Set<String> codeSet = null;

    public void method() {

        codeSet = SomeRepo.someMethod(session.getUser()); // Heavy repo call, returns user specific data.

        method1();

        method2();

        ....

        methodn();
   }

   private methodn() {
        codeSet.iterator().next();
   }
}


通过将变量范围更改为方法,并将其传递给使用此变量的所有后续私有方法,可以缓解此问题。但是,这涉及到应用程序代码中的许多更改。

是否有任何干净的解决方案可以解决以下问题而无需进行太多更改。提前致谢。

最佳答案

是的,可以通过应用以下重构轻松解决此问题:

// singleton used by multiple threads
class A {

    public void method() {
        Set<String> codeSet = SomeRepo.someMethod(session.getUser()); // Heavy repo call.
        new AProcessor(codeSet).method();
   }
}

// not a singleton, only one thread uses an instance of this class
class AProcessor {
    private final Set<String> codeSet;

    AProcessor(Set<String> codeSet) {
        this.codeSet = codeSet;
    }

    public void method() {
        method1();
        method2();

        ....

        methodn();
   }

   private methodn() {
        codeSet.iterator().next();
   }
}

09-05 08:00