オペレーティングシステムのプロセスとスレッドの違いを簡単に理解する:
プロセス:各プロセスには独立したコードとデータ空間(プロセスコンテキスト)があり、プロセス間の切り替えには大きなオーバーヘッドがあります。プロセスには1-nスレッドが含まれます。 (プロセスはリソース割り当ての最小単位です)
スレッド:同じタイプのスレッドがコードとデータスペースを共有します。各スレッドには、独立したランニングスタックとプログラムカウンター(PC)があり、スレッドの切り替えオーバーヘッドは小さいです。 (スレッドはCPUスケジューリングの最小ユニットです)
プロセスと同様に、スレッドは、作成、レディ、ランニング、ブロッキング、終了の5つの段階に分けられます。
マルチプロセスとは、オペレーティングシステムが複数のタスク(プログラム)を同時に実行できることを意味します。
マルチスレッドとは、同じプログラムで実行されている複数のシーケンシャルストリームを指します。まず第一に、お金を節約してお金を撤回する運営は、登録されるべきであり、多くの顧客がいる可能性があります。これは、複数のスレッドが必要であり、複数のスレッドが銀行を共同で操作する必要があり、銀行の金額を同期する必要があることを意味します。スレッドの安全性を確保することによってのみ。
このコードのこの例をここに挙げましょう。何か問題がある場合は、指摘してください。老人がこのマルチスレッドコードについて尋ねたからです。
まず第一に、銀行、このオブジェクトモデルの作成。
パッケージcom.lxk.threadtest.bank;/***銀行モデル、合計金額属性。 * <p> * * @author lxk on 2017/6/26 */public class Bank {/** *銀行に新興企業の資本を与えます。 */private int sum = 200; //これはこのように使用されることはありませんが、正しいロックメカニズムでもあります。コードブロックの同期。 //オブジェクトobj = new object(); /***お金を節約* [同期 - 系統関数]を追加しない場合、マルチスレッドの安全性の問題が発生します。 */public synchronized void add(int n){// synchronized(obj){sum = sum + n; try {shood.sleep(10);} catch(例外を無視){} //お金を節約する時間数が多い場合、節約のマネースレッドが実際に節約の行動を行う2つの節約であることがわかります。 system.out.println(thread.currentthread()。getname() + "... sum =" + sum); //}}/*** money* [同期]を追加しない場合、マルチスレッドの安全性の問題が発生します。 */public Synchronized void reduce(int n){if(sum -n> = 0){sum = sum -n;} else {system.out.println( "銀行のお金は十分ではない!");お金を節約します。 system.out.println(thread.currentthread()。getname() + "... sum =" + sum);}}}}コードには、保存とフェッチ、これら2つのメソッド、合計金額、およびコメントアウトコードの2つの方法があります。これはシンプルで理解しやすく、相互に排他的にマルチスレッドロックされており、スレッド間の同期を保証します。
ただし、これはまれな方法です。一般的に使用される方法は、同期されたキーワードを使用して同期メソッドを変更することです。
クライアントオブジェクトのモデル
パッケージcom.lxk.threadtest.bank;/***顧客、runnable()インターフェイスを実装し、複数の人が一緒にお金を節約できます** @author lxk on 2017/6/26**/public class顧客実装{/*** saving type*/static final string type_add = "";銀行*/民間銀行銀行;/***操作タイプのお金、貯蓄または引き出し*/プライベート文字列タイプ;/***操作数は理論的には正の数字です*/プライベートイントタイム;/***節約または撤回*/プライベートインターマネー; Money;}@Override public void run(){for(int x = 0; x <time; x ++){if(type_add.equals(type)){bank.add(money);} else if(type_reduce.equals(type_reduce.equals){bank.reduce(money);}}}}}}}}}}}顧客オブジェクトとして、多くの顧客が同時に銀行にアクセスできるため、お金の節約と撤回の運用がスレッドを使用して実装されます。
属性は、値を渡すために構築されます。
主な方法
パッケージcom.lxk.threadtest.bank;/** *銀行の預金金のマルチスレッドインスタンス * <p> * [要件:] *銀行には金庫があります。 *それぞれn * 100を預金または撤回する2人の預金者がいます。 *目的:このプログラムにセキュリティの問題はありますか?もしそうなら、それを解決する方法は? * <p> * [問題の検索方法:] * 1。どのコードがマルチスレッドコードであるかをクリアします。 * 2。明確にデータを共有します。 * 3.マルチスレッドコードのどのステートメントが共有データで動作するかをクリアします。 * * @author lxk on 2017/6/26 */public class main {public static void main(// 1つの銀行と複数の顧客銀行= new銀行(); int time = 10000; int money = 100; //この顧客は顧客c1 =新しい顧客(銀行、customer.type_add、money、money customer costults costults new customer) customer.type_reduce、time、money);スレッドt1 = newスレッド(c1);スレッドt2 = newスレッド(c2); t1.start(); t2.start();}}}上記のコードの実際の操作効果を下の図に示します。
預金とお金の撤回の回数が少ない場合、2つのスレッドにシーケンスがあることがわかります。したがって、より多くの回数があります。次に、図に示すように状況が表示されます。スレッド1はお金を引き出し、スレッド0がお金を節約すると、2つのスレッドがインターリーブされ、ストレージと引き出しの両方が実行され、パターンはありません。
これにより、データの同期が保証されます。
同期から外れる方法、つまり異常な現象、
ADDメソッドの同期キーワードを削除し、回数を減らして3回変更し、合計値を0に設定できます。もう一度コードを試してください。
いわゆる非同期現象があります。
上記の図の右側にある同期外化の結果は、2人が毎回100を節約することです。総数は得られますか? 100,200,300,400,500,600。長い時間がかかります。
ただし、操作結果はそうではありません
この時点で、ADDメソッドに同期して追加すると、左側のグラフの結果が表示されます。これは正しい結果です。
存在と撤退のために別の方法を追加しました。コードは上記のようになります。
これらは、ほとんどすべてのスレッド同期の例です。
コードを簡単に記録します。使用すると、数分で取り出すことができます。
要約します
上記は、例として銀行の引き出しを使用したJavaマルチスレッド同期問題のシミュレーションに関するこの記事の完全なコードです。私はそれが誰にでも役立つことを願っています。興味のある友達は引き続きこのサイトを参照できます:
Javaマルチスレッドプログラミングの例
Javaマルチスレッドタイマータイマーの原則と実装
Javaは、チケットを販売することでマルチスレッドを理解しています
欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!