スレッドセーフ
スレッドセーフな概念:複数のスレッドが特定のクラスにアクセス(オブジェクトやメソッド)。このクラスは、常に、このクラス(オブジェクトやメソッド)は、スレッドセーフである正確な挙動を示すことができました。
同期:任意のオブジェクトとメソッドにロックすることができ、かつコードロックは、「専用領域」または「重要な領域」と呼ばれます
示例:【com.study.base.thread.a_sync.sync001】MyThread
以下のためのパッケージ変更com.study.base.thread.a_sync.sync001; / ** * *スレッドセーフな概念:複数のスレッドが特定のクラス(オブジェクトやメソッド)にアクセスすると、このクラスは常に正しい挙動を示すことができ、このクラス(オブジェクトやメソッド) *スレッドセーフである *同期:任意のオブジェクトとメソッド、および「排他的ゾーン」または「重要な領域」と呼ばれるコードロックをでロックすることができます * *例の概要 *よりスレッドのrunメソッドがプロセスに道をラインアップへのアクセスをmyThreadとき、(ここでは合意されているCPUの割り当ての順に並ぶ) *スレッドがあれば、まず、コード内でメソッドの同期変更を実行ロックを取得しようとしたいですロックを取得し、同期コードの本文の内容を実行し、 *ロックを取得することはできません、このスレッドは、それが遠くなったまでロックを取得しようとしていきますが、同時に複数のスレッドはつまり、ロックが存在します(ロックのために競争するために競争の問題)。 * / パブリック・ クラス MyThread 実装Runnableを{ プライベート int型の COUNT = 5。; // 同期ロック 国民は 同期 ボイドRUN(){ COUNT - ; のSystem.out.println(にThread.currentThread()のgetName() + "COUNT =" + COUNT); } 公共の 静的な 無効メイン(文字列[]引数){ / ** *分析: *キューに入れられた方法を処理するmyThreadメソッド実行複数のスレッドへのアクセスが(このキューは、順序依存CPUに割り当てられている)場合 *ロック獲得する1つの試み * 2がロックを取得した場合、同期化コード実行エンティティのコンテンツを:ロックアウトされ、このスレッドが立ち上がってまでロックを取得しようとしていきます *ロックのために競争するために、同時に複数のスレッド、またロック競合の問題がある * / MyThread MyThread = 新新MyThread(); スレッドT1 = 新しい新スレッド(mythread、 "T1" )。 スレッドT2 = 新しいスレッド(mythread、 "T2" )。 スレッドT3 = 新しいスレッド(mythread、 "T3" )。 スレッドT4 = 新しいスレッド(mythread、 "T4" )。 スレッドT5 = 新しいスレッド(mythread、 "T5" )。 t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); } }
例の概要
複数のスレッドがmyThread runメソッドにアクセスすると、(キューイングは、CPUの割り当てのために合意された)プロセスに道をラインアップするために、スレッドはコード内でメソッドの同期変更を実行しようと、最初のロックを取得しようと、あなたがロックを取得した場合、同期コードの本文の内容を実行し、ロックを取得することはできません、それは遠くなったまで、このスレッドはロックを取得しようとしていきますが、同時に複数のスレッドは、ロックのために競争するために(つまり、ロックが存在します競争の問題)。
第二に、複数のスレッド複数のロック
:複数のロック、複数のスレッドが複数のスレッドの後にコンテンツ同期メソッド本体を実行し、そのロックを取得することができ、各スレッドは、指定されたロック与えました
示例:【com.study.base.thread.a_sync.sync002】をマルチスレッド
以下のためのパッケージ変更com.study.base.thread.a_sync.sync002; / ** *複数のロック複数のスレッド:複数のスレッド、各スレッドは、あなたの指定されたロックの後にコンテンツ本体を取得するには、同期メソッドを実行することができ、それぞれロック *ロックのキーワード同期取得はれるオブジェクトがロックに属している行を保持するスレッド、同期キーワードを実行するためにオブジェクトのロックではなく、ロックなどのコード(メソッド)の一部なので、サンプルコード方法であって、(ロック)、二つのオブジェクト。得られたスレッドは、2つの異なるロックして、彼らはそれぞれに影響を与えません。 でも、静的メソッドにsynchronizedキーワードを追加し、一つのケースは同じロックである*、ロックされた.class、クラスレベルのロック(排他的に.classクラス)を表現。 * / パブリック クラスマルチスレッド{ プライベート int型 NUM = 0 ; 公共 同期 無効printNum(タグ文字列){ 試み{ IF(tag.equals( "A" )){ NUM = 100 ; System.out.println( "タグA、オーバー設定NUM" )。 Thread.sleep( 1000年); } 他{ NUM = 200 。 System.out.println(「NUMオーバー設定タグB」)。 } } キャッチ(InterruptedExceptionある電子){ // TODO自動生成キャッチブロック e.printStackTrace(); } のSystem.out.println( "タグ"+タグ+"、NUM =" + NUM)。 } // 注意观察実行方法的输出顺序 のパブリック 静的 ボイドメイン(文字列[]引数){ // 两个不同的对象 最終マルチスレッドM1 = 新しいマルチスレッド()。 最終的なマルチスレッドM2 = 新しいマルチスレッド()。 スレッドT1 = 新しいスレッド(新しいRunnableを(){ @Override 公共 ボイドラン(){ // TODO自動生成方法スタブ m1.printNum( "A" ); } }、 "T1" )。 スレッドT2 = 新しいスレッド(新しいRunnableを(){ @Override 公共 ボイドラン(){ // TODO自動生成方法スタブ m2.printNum( "B" )。 } }、 "T2" )。 t1.start(); t2.start(); } }
例の概要
ロックのキーワード同期取得が(ロックオブジェクトのロックではなく、ロックなどのコード(メソッド)の一部なので、オブジェクトはロックに属している行を保持するにどのスレッド同期キーワードを実行するためのサンプルコード方式であります)、二つのオブジェクト。得られたスレッドは、2つの異なるロックで、彼らも、静的メソッドにsynchronizedキーワードを追加し、それぞれが状況は同じロックされてい影響を与えていない、ロックされた.class、クラスレベルのロック(排他的に.classクラス)を表明しました。
第三に、オブジェクトは、同期および非同期ロック
同期:リソースを共有していない場合は、同期同期の概念が共有することで、私たちは言葉を「共有」に留意しておきたい、同期化する必要はありません
非同期:非同期非同期の概念が相互間のいずれかの制約に依存しない、対象ではありません。私たちは、Ajaxのページリクエストで開始されます。httpは、我々はまた、操作の内容ページを閲覧し続けることができたときに学ぶのと同じように、両者の間に関係はありません
目的は、実際には、スレッドセーフ同期させることで、スレッドの安全性のために、二つの特徴を満たす必要があります。
原子性(同期)
可視
示例:【com.study.base.thread.a_sync.sync003】MyObjectに
パッケージcom.study.base.thread.a_sync.sync003。 / ** * *对象的同步和异步问题 * * / パブリック クラスMyObjectに{ 公共 同期 のボイド法1(){ しようと{ System.out.print(にThread.currentThread()のgetName()); Thread.sleep( 4000 ); } キャッチ(例外e){ e.printStackTrace(); } } / ** 同期* / 公共 ボイド方法2(){ System.out.printlnは(にThread.currentThread()のgetName()。)。 } パブリック 静的 ボイド(文字列[]引数){主 最終 MyObjectにMoが= 新しい新しいMyObjectに(); / ** *分析: オブジェクト保持された物体をロックする* T1ねじロック、T2スレッドが非同期の非同期修飾オブジェクトを呼び出すことができ方法 * t1のスレッドは、あなたが同期され、この時、で待機する必要があるオブジェクトの同期(同期)メソッドを呼び出した場合、オブジェクトがロックオブジェクト、T2のスレッドをロック保持する * / スレッドT1 = 新しい新しいスレッド(新しい新しいRunnableを(){ @Overrideを 公共 ボイドRUN(){ // TODO自動生成されたメソッドスタブ mo.method1(); } }、 "T1" ); スレッドT2 = 新しい新スレッド(新しいRunnableを(){ @Override 公共 ボイドラン(){ // TODO自動生成方法スタブ mo.method2(); } }、 "T2" )。 t1.start(); t2.start(); } }
例の概要
最初のオブジェクトのスレッドがオブジェクトのロックロックを保持して、Bのスレッド同期され、あなたが待機する必要がありますが、この時点で同期のオブジェクトを呼び出す場合(同期)する方法、
第1のオブジェクトのスレッドがオブジェクトのロックロックを保持している、Bスレッドは非同期オブジェクトを修正するための非同期メソッドを呼び出すことができ
第四に、ダーティリード
オブジェクトの同期および非同期メソッドの場合、我々は全体的な問題を検討してください、自分のプログラムを設計、または一貫性のないデータエラーが発生し、それは古典的な間違いで汚れていること(dirtyread)を読み込みます
示例:【com.study.base.thread.a_sync.sync004】DirtyRead
パッケージcom.study.base.thread.a_sync.sync004; / ** *全体のトラフィックが同期フル要求する、維持アトミック事業 * * * / パブリック クラスDirtyRead { プライベート文字列のユーザ名=「ラング」; プライベート文字列のパスワード= "123" ; 公共 同期 無効のsetValue(ユーザ名の文字列、文字列のパスワード){ この .username = ユーザ名; 試み{ のThread.sleep( 2000 ); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } このみましょう。パスワード= パスワード; System.out.println( "setValueの最终结果、ユーザ名=" +ユーザー名+ "パスワード=" + パスワード)。 } 公共 同期 ボイドのgetValue(){ System.out.printlnは( "のgetValue方法得到、ユーザ名=" +名+ "パスワード=" + パスワード)。 } パブリック 静的 ボイドメイン(文字列[]引数)スローInterruptedExceptionある{ 最終 DirtyReadのDR = 新しいDirtyReadを(); スレッドT1 = 新しいスレッド(新しいRunnableを(){ @Override 公共 ボイドラン(){ dr.setValue( "Z3"、 "456" )。 } }、 "T1" )。 t1.start(); Thread.sleep( 1000年); dr.getValue(); } }
例の概要:
我々は、オブジェクトのメソッドをロックすると、我々は全体的なビジネス、同時にそのアトミック事業(サービス)を確保するための同期同期キーワードをロックするための、すなわちのsetValue /のgetValueメソッドを考慮する必要があり、そうでない企業のエラーが発生します(また、側面から事業の一貫性を確保するため)。