2016-06-17 5 views
-1

のは、私は次のコードを持っているとしましょう:Javaの更新クラスのメンバー、それが再作成され

public Class classA{ 

private classC objC; 
private Properties prop 

initializeA(){ 
//Creating a new objC here 
this.objC = new C(this.prop); 
} 
public void doStuffA(){ 
    //do something here that uses objC.method() 
} 
} 

をそして、私のClassBのは、次のとおりです。今

public class B{ 

    @Autowired 
    classA objA; 

    initializeB(){ 
    objA.initializeA(); 

    } 

    public void doSomething(){ 
     //Multiple threads keep calling this method and this code block calls   objA.doStuffA() 
     } 

    } 

、誰でもときinitializeB何が起こるかを説明してくださいすることができます何らかの再初期化が行われたときにスレッドによって呼び出されますか? ClassAに、プロパティを更新した新しいobjCが追加されるようになりました。クラスBでdoSomethingにアクセスしている複数のスレッドは、classAが再初期化されたときに2回目に作成した新しいobjCを自動的に使用しますか?

PS:これは揮発性変数を使用して解決できますか?

1)複数のスレッドは、クラスC

のクラスAの現在のインスタンスを使用しているdoSomethingのを呼び出す繰り返される)

2 Bに作成さautowiredれるクラスAのインスタンスを仮定すると:[OK]を次のように与え

+0

これを控えめにして閉じると提案した人は、この質問がここでは重要ではないと思われる理由についてコメントしてください。 – user2441441

答えて

1

3)「ステップ2の反復」中に、誰かがinitializeB()を呼び出すとき、ClassCのインスタンスがClassCの新しいインスタンスに置き換えられます。これにより、以前のクラスCのインスタンスへの参照が削除されます。

この時点で、スレッドがclassCオブジェクトの古いインスタンスの処理中であった場合、古いインスタンスを使用して実行を終了します。ただし、今後doSomethingを呼び出すと、classCの新しいインスタンスが使用されます。

classAが再初期化時に2回目に作成した新しいobjCを自動的に使用しますか?

Yes 

PS:これは揮発性変数を使用して解決できますか?

I am not seeing an issue with this code other than some poor programming practices. 

私はあなたが達成しようとしていることを尋ねる気にならない場合は、おそらくこれを行うもっと良い方法があります。

+0

ありがとう!私はどこでもこれを見つけることができませんでした。私はここでプログラミングの選択肢が悪いことを知ることに興味があります。バックグラウンドについては、classAは私によって作成され、classBは他の誰かが私のために作成したアプリケーションの一部です。 classBは、アプリケーションからいくつかのロジックを拡張し、データ部の送信を処理するはずのクラスAを呼び出します。 ClassCは第三者図書館です。 – user2441441

+1

あなたのコードは完全に機能していますが、かなり危険な慣行があります。たとえば、現在のスレッド設定との共有の可能性があります。 「doSomething」メソッドが何をするかによって、予期しない結果が生じる可能性があります。プロパティリスナーを設定してプロパティの変更を検出し、SpringコンテキストをリフレッシュしてBeanを再作成することをお勧めします。プロパティファイルの更新の例は、次のURLにあります。https://examples.javacodegeeks.com/enterprise-java/spring/reloadedable-properties-file-spring-using-apache-commons-configuration/ –

関連する問題