4

簡単な例:

      class Account{
           private String account_name;
           private String password;
           private double balance;

           public synchronized double getBalance(){
                  return balance;
           }
           public synchronized void setBalance(double add){
                  balance += add;
           }
      }

オブジェクトに関連付けられたロックを取得しても、他のスレッドがそのオブジェクトにアクセスするのを妨げることはないという私の理解から。アクセスを防ぐには、同じロックである必要があります。

したがって、2人が異なるATMで同じアカウントにアクセスしようとすると、このAccountオブジェクトの2つの異なるインスタンスが作成されます。それで、それは同じロックで守られていませんよね?

人物A(スレッドA)が口座にお金を貯めようとしたと同時に、人物B(スレッドB)が口座の合計残高を取得しようとした場合を考えてみましょう。

それはどのように機能しますか?次のリクエストが届いたときにAccount同じオブジェクトを返すように、使用中にキャッシュしますか?Account

4

4 に答える 4

5

同期されたメソッドは、オブジェクトインスタンスをロックします。ただし、同期されていないメソッドがある場合は、同時アクセスが発生する可能性があります。

ATMマシンはあなたのアカウントにアクセスしません-銀行のサーバーはアクセスします。ATM機は単なるクライアントです。したがって、2つの異なるATMから同じアカウントにアクセスすることは、銀行サーバーによって保護されます。銀行サーバーは、メモリ/データベースにこのアカウントのインスタンスを1つだけ持っています(おそらく、何らかのロックメカニズムによって保護され、Javaで記述されていません)。

于 2012-09-02T14:57:45.600 に答える
0

これは、システムの実装方法によって異なります。通常、クラスのインスタンスがあり、各インスタンスには暗黙のロックが関連付けられています。または、単純なものを作成することもできます。

プライベートオブジェクトロック;

そして、すべての人(ATM、銀行員、その他)がこのロックを明示的に取得する必要があります。結局のところ、それはシステムがどのように設計され実装されているかを要約します-ロッキングプリミティブはまさにそれです-プリミティブ。を利用し、すべてのコンポーネントでそれらを適切に利用するかどうかは、設計者/実装者次第です-一貫したロック。さらに、この場合、アトミックダブルを使用して、潜在的に重いオブジェクトロックを取得する手間を省きます。

于 2012-09-02T14:55:24.180 に答える
0

私の推測では、キャッシュなどのオブジェクトプールを使用しており、リクエストが発生するたびに、アカウント番号などの一意の識別子を使用して、プール内に存在する特定のオブジェクト(アカウント)を検索します。存在する場合は参照が返されます。それ以外の場合は、永続データソースからプールにロードされ、新しい参照が作成されて返されます。したがって、2人のユーザー(スレッド)でも同時にアクセスしようとします。サーバーは、それぞれに2つのインスタンスを作成しません。

次に、クラス内に複数の同期メソッドがあり、スレッドが現在同期メソッド内で実行されている場合、同じオブジェクトの同期メソッドにアクセスしようとしている他のすべてのスレッドは、最初のスレッドが同期メソッドが存在するまでブロックされます(実行が一時停止されます)。

于 2012-09-02T16:02:21.223 に答える
0

オブジェクトに関連付けられたロックを取得しても、他のスレッドがそのオブジェクトにアクセスするのを妨げることはないという私の理解から。アクセスを防ぐには、同じロックである必要があります。

正しい。複数のスレッドが単純なロックを取得しようとすると、onのみが続行を許可されます。ただし、ロックは必ずしも単一のオブジェクトに関連付ける必要はありません。他のタスクのロックを作成することもできます。

したがって、2人が異なるATMで同じアカウントにアクセスしようとすると、このAccountオブジェクトの2つの異なるインスタンスが作成されます。それで、それは同じロックで守られていませんよね?人物A(スレッドA)が口座にお金を貯めようとしたと同時に、人物B(スレッドB)が口座の合計残高を取得しようとした場合を考えてみましょう。それはどのように機能しますか?使用中にアカウントをキャッシュして、次のリクエストが届いたときに同じアカウントオブジェクトを返すようにしますか?

ある意味、あなたが説明しているのは分散ロックシナリオですが、これはまったく異なります。すでに誰かが述べたように、ATMは銀行で処理するためにトランザクションを送り返し、そこでのサーバーは同時実行の問題を処理します。

于 2012-09-02T16:24:35.330 に答える