複数のスレッドフェイス質問、ちょうどここ交互に二つの方法で印刷0-100を達成するために、練習の手に使用を共有し、誰も退屈では、次の2つを見てみることができます。
Aは、同期が達成します:
パブリック クラスPrintNumberIncrInSynchronized { プライベート 静的 int型の数。 プライベート 静的 最終 Objectオブジェクト= 新しいオブジェクト(); パブリック 静的 ボイドメイン(文字列[]引数){ 新しいスレッド(() - > { ながら(数<100 ){ 同期(オブジェクト){ // 相对%2判断奇偶数、&效率更高 場合((数1& )== 0 ){ System.out.printlnは(にThread.currentThread()のgetName() + ":" +数++ )。 } } } }、 "偶数" ).start(); 新しいスレッド(() - > { ながら(数<100 ){ 同期(オブジェクト){ もし、((数&1)== 1 ){ System.out.printlnは(にThread.currentThread()のgetName() +「: 「+数++ ); } } } }、 "奇数" ).start(); } }
結果: さえ: 0 奇数: 偶数: 2 奇数: 3 偶数: 4 奇数: 5 偶数: 6 奇数: 7 でさえ: 8 奇数: 9 偶数: 10 奇数: 11 でも: 12 奇数: 13 でも: 14 奇数: 15 偶数: 16 奇数: 17 偶数: 18 奇数: 19 偶数: 20 奇数: 21 偶数: 22 奇数: 23 偶数: 24 奇数: 25 偶数:26 奇数:27 偶数:28 奇数:29 偶数:30 奇数:31 偶数:32 奇数:33 偶数:34 奇数:35 偶数:36 奇数:37 偶数:38 奇数:39 偶数:40 奇数:41 偶数:42 奇数:43 偶数:44 奇数:45 偶数:46 奇数:47 偶数:48 奇数:49 偶数:50 奇数:51 偶数:52 奇数:53 偶数:54 奇数:55 偶数:56 奇数:57 偶数:58 奇数:59 偶数:60 奇数:61 偶数:62 奇数:63 偶数:64 奇数:65 偶数:66 奇数:67 偶数:68 奇数:69 偶数:70 奇数:71 偶数:72 奇数:73 偶数:74 奇数:75 偶数:76 奇数:77 偶数:78 奇数:79 偶数:80 奇数:81 偶数:82 奇数:83 偶数:84 奇数:85 偶数:86 奇数:87 偶数:88 奇数:89 偶数:90 奇数:91 偶数:92 奇数:93 偶数:94 奇数:95 偶数:96 奇数:97 偶数:98 奇数:99 偶数:100
二つのスレッドを起動し、名前の、そして唯一の奇数と偶数印刷しました。常にロック競争を監視することにより、裁判官++および印刷する場合にのみ満たします、そして最終的に要件を達成するために。常にロック競合の必要性、実装プロセスから見ることができ、そしておそらく条件ではなく、効率的に十分に満たしていません。
二、待って達成通知:
パブリック クラスPrintNumberIncrInWaitAndNotify { プライベート 静的 INT 番号、 プライベート 静的 最終オブジェクトオブジェクト= 新しい新しいオブジェクト(); 公共の 静的な 無効メイン(文字列[]引数)がスローInterruptedExceptionあるが{ 新規新しいスレッド(新しい新しい ToolClass()、「偶数」).start(); // ここで、スリープ10msでさえスレッドが最初に実行できることを確認 のThread.sleep(10 )、 新しい新しいスレッド(新しい新しい ToolClass()、「奇数」).start(); } 静的 クラス ToolClass実装のRunnable { @Override 公共 ボイドラン(){ ながら(数<= 100 ){ 同期(オブジェクト){ System.out.printlnは(にThread.currentThread()のgetName() + ":" +数++ )。 object.notify(); 試す{ ()はObject.waitします。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } } } }
結果: さえ: 0 奇数: 偶数: 2 奇数: 3 偶数: 4 奇数: 5 偶数: 6 奇数: 7 でさえ: 8 奇数: 9 偶数: 10 奇数: 11 でも: 12 奇数: 13 でも: 14 奇数: 15 偶数: 16 奇数: 17 偶数: 18 奇数: 19 偶数: 20 奇数: 21 偶数: 22 奇数: 23 偶数: 24 奇数: 25 偶数:26 奇数:27 偶数:28 奇数:29 偶数:30 奇数:31 偶数:32 奇数:33 偶数:34 奇数:35 偶数:36 奇数:37 偶数:38 奇数:39 偶数:40 奇数:41 偶数:42 奇数:43 偶数:44 奇数:45 偶数:46 奇数:47 偶数:48 奇数:49 偶数:50 奇数:51 偶数:52 奇数:53 偶数:54 奇数:55 偶数:56 奇数:57 偶数:58 奇数:59 偶数:60 奇数:61 偶数:62 奇数:63 偶数:64 奇数:65 偶数:66 奇数:67 偶数:68 奇数:69 偶数:70 奇数:71 偶数:72 奇数:73 偶数:74 奇数:75 偶数:76 奇数:77 偶数:78 奇数:79 偶数:80 奇数:81 偶数:82 奇数:83 偶数:84 奇数:85 偶数:86 奇数:87 偶数:88 奇数:89 偶数:90 奇数:91 偶数:92 奇数:93 偶数:94 奇数:95 偶数:96 奇数:97 偶数:98 奇数:99 偶数:100
各操作が行わ++及び印刷後、待機())スレッドに待ち状態と待ちを(コールは、同様の操作をロックを取得するために別のスレッドをモニタロックを解除するので、別のウェイクアップを通知し、最終的になります要件。