-1

こんにちは、スレッドを同期するために、型ではなく Double オブジェクトを使用しようとしています。これは宿題です。

概要: このアプリケーションは、銀行システムの簡単な例です。預金者として実行されるスレッドと、引き出し者として実行されるスレッドがあります。預金者は 10 ドルを追加し、引き出し者は 10 ドルを削除するため、アプリケーションの最後には変更されていない 10 の銀行口座が必要です。

各クラス (預金者と引き出し者) で、アカウント オブジェクトでブロック同期を使用して目標を達成することができました。これで私の課題の宿題部分は終了しました。そのための助けは必要ありません。

考えてみると、Account オブジェクト全体をロックするのはやり過ぎだと感じました。重要なトランザクションの唯一の実際の部分は、変数の変更であるため

 balance

元々、可変残高は倍でした。私の目標は、変数を Double オブジェクトに変更してから、同期ブロックを account オブジェクト内に移動し、balance 変数を変更するコードの部分だけに移動することでした。

コードを Double に変更すると、エラーは発生しませんが、メモが表示されます。

This element has no attached source and the Javadoc could not be found in the attached Javadoc

また、最後に私の値がすべて間違っているため、コードは機能しません。

質問:

  1. Balance変数のみをロックできるはずだという私の理論は正しいですか?
  2. Double の Java.lang コードをコードに認識させるにはどうすればよいですか?

ありがとう

ここにいくつかのコードがあります...

宣言:

private Double balance;

コンストラクタ:

this.balance = new Double(balance);

ロック:

synchronized(balance){

balance = balance + amount;

}
4

1 に答える 1

1

Balance変数のみをロックできるはずだという私の理論は正しいですか?

いいえ。

synchronized(balance) {
    balance = balance + amount;
}

をロックすると、変数ではなくの値であるインスタンスbalanceが実際にロックされます。ただし、値を別のインスタンスに置き換えます。他のスレッドが出現した場合、現在のスレッドが古い で保持しているロックを解放する前に、新しい を認識してそのロックを取得する可能性があります。つまり、適切な相互排除が得られません。さらに、「前に起こる」関係の前提条件が満たされていないため、スレッドは共有変数とオブジェクトの一貫性のないバージョンを参照する可能性があります。Double balancebalancebalanceDoubleDoubleDouble

インスタンス変数をロックする場合は、インスタンスであるオブジェクトをロックする必要があります。


Double の Java.lang コードをコードに認識させるにはどうすればよいですか?

これは IDE の問題です。IDE は、IDE が使用するように構成されている「rt.jar」ファイルに対応するソース JAR ファイルを見つけることができません。これは、JRE で「rt.jar」ファイルを使用するために IDE を使用したことが原因である可能性が最も高いです。解決策は、JRE に対応する JDK を使用するように IDE を再構成することです。

これにより、プログラムの動作が変わるわけではないことに注意してください。これは、(たとえば) シングル ステップでコア クラスに入るときに、ソース コードを表示する IDE の機能にのみ影響します。

于 2012-09-26T15:24:29.187 に答える