2017-02-16 70 views
0

未發佈的Java應用程序代碼具有以下結構(這在許多地方都有)。該類只在應用程序上下文加載期間加載一次。以前這工作得很好。但是,當移動到具有多個線程的迴歸環境時,由於共享成員變量,這會導致併發問題。替換Spring綁定類中的共享成員變量

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(); 
    } 
} 

此問題可以通過將變量作用域更改爲方法,並讓它跨所有使用此變量的後續私有方法來緩解。但是這涉及到應用程序代碼的很多變化。

是否有任何干淨的解決方案,可以解決以下沒有太多的變化。提前致謝。

+0

你提到線程的問題。例如比賽條件或什麼? –

+0

該變量可以被併發線程訪問導致數據被破壞 –

+0

你有沒有試過java ReentrantLock鎖定該成員,直到該特定線程完成它或同步? –

回答

2

是,這個問題可以很容易地通過應用下列重構解決:

// 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(); 
    } 
} 
+0

+1謝謝..似乎是一個優雅的解決方案,但仍涉及到一些重構。在接受之前,會等待其他解決方案(如果有的話)。 –