ロックインターフェースのJDK記述に従ってLock
実装用いるより提供synchronized
操作および利用可能な文の方法をロックするより広い範囲を。彼らは完全に異なる特性を有していてもよく、より柔軟な構造化を可能にし、関連する複数のサポートすることができるとオブジェクトをCondition
。
Javaはsynchronizedキーワードである、とロックはインターフェースです。ロックロックは同期ロックが(ランダムウェイクつのスレッドまで)とnotisfy(スレッドのリリースにロックを遮断)と待って、synchronizedキーワードロック・スレッドの通信よりもはるかに柔軟である3スレッド間通信における内notisfyAll(すべてのスレッドを覚まします)方法。スレッド間通信は、多くの場合、資源の浪費、不必要なオーバーヘッドの形成をもたらすように、すべてのスレッドが唯一の裁判官が起き、その後、ダウンを実行するためにどのスレッドを決めることができ、糸をきっかけに指定することはできません。APIロックロックは別々に指定されたスレッドがそう同期キーワードを用いてより柔軟かつ実用的な処理スレッドの実装のための規定の場合には、ウェイクアップを提供することができます。
例えば、以下の場合:3つのスレッド、一つのスレッドに必要な印刷枚数5 1-5、1-10スレッド2印刷番号10の後に、15スレッド3 1-15プリント枚数、スレッド後の印刷番号5、スレッド10第二プリント枚数。。。。。。サイクル5サイクル。
メソッドのロックは、通信のスレッドをロック:
1つの インポートjava.util.concurrent.locks.Condition。
2 インポートjava.util.concurrent.locks.Lock。
3 インポートjava.util.concurrent.locks.ReentrantLock。
4
5 パブリック クラスPrint_01 {
6 パブリック 静的 ボイドメイン(文字列[]引数){
7 プリントプリント= 新しいプリント()。
8 新しい > -スレッド((){
9 用(INT I <5; I ++ I = 0 ){
10 print.print5();
11 }
12 }、 "A线程" ).start();
13 新しいスレッド(() - > {
14 のために(INT I = 0、I <5; I ++ ){
15 print.print10();
16 }
17 }、 "B线程" ).start();
18 新しいスレッド(() - > {
19 のために(INT iが= 0; I <5; I ++ ){
20 print.print15();
21 }
22 }、 "C线程" ).start();
23 }
24 }
25 クラス{印刷
26は、 プライベート int型。COUNT = 3 ;
27 // ラッチロック使用
28 ロックロックを= 新しい新しいReentrantLockのの();
29 条件条件conditio1 lock.newCondition =()のため; // キー
30 の条件条件conditio2 lock.newCondition =()のため; / / キー
31は、 条件条件conditio3のlock.newConditionため=(); // キー
32
33である 公共 ボイド(){print5
34は Lock.lock();
35 試み{
36 // 分析
37 ながら!。(COUNTを1 =){
38 conditio1.await()。
39 }
40 // 干活
41 のために(INT I 1 =、iは<= 5; I ++ ){
42 System.out.print(にThread.currentThread()のgetName()+。I)。
43 のSystem.out.println();
44 }
45 // 通知
46 カウント= 2 。
47 conditio2.signal()。
48 } キャッチ(例外e){
49 e.printStackTrace();
50 }最後に{
51は lock.unlock();
52である }
53である }
54である
55 公共 ボイドprint10(){
56は Lock.lock();
57である トライ{
58の // スレッドが再びウェイクアップ後に複数のスレッドが、中に使用されなければならないことを決定するかを決定裁判官、それ以外の場合はfalseをウェイクアップが作成されます(3つのスレッドとよりが間違って行くだろう)
59 しばらく(COUNT = 2!{)
60 conditio2.await();
61 }
62 // 作品
63 のための(int型私は1を=; I <= 10; I ++ ){
64 System.out.print(。にThread.currentThread()のgetName()+ I)。
65 のSystem.out.println();
66 }
67 // 通知
68 数= 3 ;
69 conditio3.signal()。
70 } キャッチ(例外e){
71 e.printStackTrace();
72 } 最後に{
73 lock.unlock()。
74 }
75 }
76 公共 ボイドprint15(){
77 lock.lock()。
78 試み{
80 ながら(カウント= 3!){
81 conditio3.await()。
82 }
84 のために(INT I 1 =、iは<= 15; I ++ ){
85 System.out.print(にThread.currentThread()のgetName()+。I)。
86 のSystem.out.println();
87 }
89 カウント= 1 。
90 conditio1.signal()。
91 } キャッチ(例外e){
92 e.printStackTrace();
93 } 最後に{
94 lock.unlock()。
95 }
96 }
97 }