0

BankAccount 送金の古典的な問題の同期コードを作成しようとしました。今、私は解決策の問題を理解しようとしています。Web で見つけたどのソリューションでも、転送方法で 2 つのロックが使用されていましたが、私は使用しませんでした。

    class BankAccount
    {
      double balance;

      public void synchronized deposit(double amount)
      {
          balance+=amount;
       }

      public void synchronized withdraw(double amount)
      {
         balance-=amount;
      }

      public void transferTo(BankAccount b, double amount)
      {
           this.withdraw(amount);
           b.deposit(amount);

       }
   }

の何が問題なのか教えてくださいtransferTo()。での制限チェックを省略して申し訳ありませんbalance。transferTo をアトミックにしないと問題 (デッドロック) が発生しないかどうか、実際に心配しています。そのような状況の例は素晴らしいでしょう。

4

3 に答える 3

1

doubleの使用を除けば、特に問題はありませんが、transferToがアトミックでない場合は後で問題が発生する可能性があることに注意する必要があります。ただし、実際にはロックを使用しています。同期された各メソッドは、暗黙的にロックを使用します。

于 2012-08-16T04:56:47.533 に答える
0

組み込みロックを使用しています。

于 2012-08-16T04:56:07.367 に答える
0

ブロックを配置するとすぐにロックを使用しますsynchronized。この場合、ロックは変更中のクラスオブジェクトに対して取得されます。これが、コードが正常に機能する理由です。

ただし、transferToこの内部の両方の操作は同期されますが、トランザクション全体ではないため、メソッドが正しく機能しない可能性があります。

お役に立てれば!!!

于 2012-08-16T04:58:02.510 に答える