この記事では、主に、銀行ユーザーがお金を引き出す例を介して、Javaプログラミングマルチスレッドの同時処理シナリオを示しています。
例から始めます。銀行口座の引き出しシナリオの例コードを実装します。
ファーストクラス:account.java
アカウントカテゴリ:
パッケージcn.edu.byr.test; public classアカウント{private string councountno; private double balance; publicアカウント(){}パブリックアカウント(String Accountno、double balance){this.accountno = courcountno; this.balance = balance;} public inthashcode(){return cuncountno() double getBalance(){return this.balance;} public void setbalance(double balance){this.balance = balance;} public boolean equals(object obj){if(this == obj)return true; if(obj!= null && obj.getclass()== councount.class){account target =(アカウント)obj; Target.getAccountNo()。equals(courcedno);} return false;}} 2番目のクラス:drawthread.java
マネー離脱スレッドクラス:
パッケージcn.edu.byr.test; public class drawthreadはスレッド{private account account; private double drawmount; public drawthread(string name、account account、double drawamount){super(name); this.account = account = drawamount; drawamount){system.out.println(getname() + "お金を正常に取得し、banknotesを吐き出します:" + drawamount); // try {// thread.sleep(1); //} // catch(arturtedexception e){// e.printstacktrace(); //} account.setbalance(account.getbalance() - drawamount); system.out.println( "/tバランスは:" + account.getbalance());} else.out.println(getname() + "Get Money failed!"); //}} pubal drawthread( "a"、acct、800).start(); new DrawThread( "b"、acct、800).start();}}}上記のコードでコメントした部分: (1)同期化された同期コードブロック(2)スレッド冬眠。 (1)および(2)の場合、実行結果には多くの可能性があります。これは、通常のロジックに適合する可能性の1つ(確率は小さい)です。
bはお金を正常に引き出し、お金を吐き出します:800.0
バランスは200.0です
失敗した撤退と残高は不十分でした!
Bが最初にマネー離脱リソースを見つけ、Aがユーザーの残高を判断する前にバランスを正しく修正することです。この確率は非常に少なく、ほとんどの操作は次の状況に似ています。
お金を正常に引き出してお金を吐き出す:800.0
bはお金を正常に引き出し、お金を吐き出します:800.0
バランスは次のとおりです。 -600.0
バランスは200.0です
これは明らかに非論理的です。実行中の結果から、Aは最初にリソースを押収して金額を撤回すると推測できますが、バランスを変更する前に、リソースはBによって押収されます。バランスが変更されていないため、Bはバランスがまだ800であることを確認し、Bは依然として金額を引き出します。最初に変更バランスを実行しますが、印刷しません。Bはリソースを奪います。 Bはバランスを変更し、バランスを印刷します。これは-600です。バランスは200です。
(2)スレッドが睡眠をとる場合、AまたはBは量を取得した後に睡眠のためにCPUリソースを放出するため、エラー条件である必要があり、JVMは準備が整った状態で他のプロセスを呼び出します。 2つ目は、お金を引き出し、バランスが間違っているに違いないと判断することです。
(1)同期化された同期コードブロックが追加された場合、アカウントはスレッド実行メソッド本体にロックされています。その場合、実行ロジックは毎回正常であることが保証されます。
お金を正常に引き出してお金を吐き出す:800.0
バランスは200.0です
Bはお金を引き出すことができず、バランスは不十分でした!
実行プロセスを想像できます。
最初にリソースを先取りし、最初に実行方法本体でアカウントクラスをロックします。次に、同期コードブロックの実行を開始します。中央の特定のリンクに実行される場合、CPUリソースはBによって先取りされます。 Bは実行を開始し、最初にアカウントクラスをロックします。ただし、ロックを追加すると、アカウントがAによって占有されていることがわかり、ブロッキング状態に調整され、Aがリソースをリリースするのを待ちます。 Aが同期コードブロックを実行した後、アカウントロックがリリースされ、Bは引き続き実行されます。実行中に見られるバランスはAによって変更されることが保証されており、正しいロジックに従って正常に実行されます。
要約します
上記は、Javaプログラミングのマルチスレッドコンカレント処理インスタンスの分析に関するこの記事のすべての内容であり、すべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!