複数のスレッドでJava同期ロック機構を使用する場合は、ロックがオブジェクトに注意を払う必要があり、次の例では、オブジェクトのロックではありません
例:銀行口座を持つ2人の運転は、彼女の夫は、銀行の窓口業務の妻でATMマシンで動作します
アカウントの種類:百万アカウントがあります。
パブリック クラスACOUNT { 公共 のintお金= 100 ; }
ATMの機械クラス:内部のお金を取るためにオブジェクトやACOUNTの数の存在は、プロセスtakeMoneyに追加同期メカニズム
パブリック クラス ATMには実装されたRunnable { プライベートACOUNTのACOUNTを。 プライベート int型withdrawMoney。 公衆 ATM(ACOUNTのACOUNT、int型withdrawMoney){ この .acount = ACOUNT。 この .withdrawMoney = withdrawMoney。 } @Override 公共 ボイドラン(){ takeMoney()。 } 公共 同期 ボイド takeMoney(){ // 取钱 場合(acount.money < withdrawMoney){ リターン; } 試し{ のThread.sleep( 200は); // スレッド1を入力した後、スリープ、スレッド2は依然として赤字になる可能性があり、中に来ることができる } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } System.out.printlnは(スレッド。.currentThread()のgetName() + "とら" + withdrawMoney + "万元" ); acount.money - = withdrawMoney; のSystem.out.println( "口座残高:" + acount.money); } }
Customerクラス:二人が使用するために、それぞれ、2つのATM機(1つのアナログカウンタ)、ユニークなアカウントを作成します
パブリック クラスカスタマー{ 公共の 静的な 無効メイン(文字列[] args)を{ ACOUNTのACOUNT = 新新ACOUNT(); ATM ATM1 = 新しい新しい ATM(ACOUNT、70); // ATM操作するアカウントで、夫、妻の運転アカウントカウンター ATM ATM2 = 新しい新しい ATM(ACOUNT、80 ); スレッド夫 = 新しい新しいスレッド(ATM1、 "夫" ); スレッド妻 = 新しい新しいスレッド(ATM2、 "妻" ); husband.start(); wife.start(); } }
結果:
あなたは追加見ることができ、同期がまだスレッドセーフ後に発生します。
分析:同期機構は、一般に、データ・オブジェクトの操作に使用され、この方法は、この例では、クラスの動作を考慮して2つのクラスが、アカウントクラス、クラス2台のATMマシンの合計、ATMマシンがあるtakeMoney ATM機に属する方法でありますので、私たちは、アカウントタイプをロックする必要があります。