即将发布的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();
}
}