本の内容に基づいて、ロックと条件についての重要なポイントを要約するために、今日ロック機構のロック+条件を書か昨日:
、保護コードの断片で1つだけのスレッドが保護でコードを実行している任意の時間をロックします。
ロックは、保護されたコードセグメントを入力しようとしているスレッドを管理することができます。
ロックは、1つまたは複数の関連条件オブジェクト(Lock.newConditionを使用して作成)を持つことができます
保護されたコードセグメントに入ったが、条件を満たしていない各条件オブジェクト管理スレッドを実行することはできません。
今日、私たちは内部ロックでJavaについてのすべてのオブジェクトをお話しましょう、そしてあなたは、キーワードの文synchonizedメソッドを使用している場合、そのオブジェクトのロックは、メソッド全体を保護します。このメソッドを呼び出すには、スレッドは、内のオブジェクトのロックを取得する必要があります。(メソッドの宣言にキーワードを同期して、あなたは、オブジェクトの内側、またしてみてください - 最後に使用せずにロックを取得する必要はありません)
唯一つのロック内部オブジェクトに関連する状態、待機中のスレッドがオブジェクトの条件に比べ、のnotifyAllが状態を遮断解除された設定待機するスレッドを追加する方法を待つ、待機()= Condition.await();のnotifyAll()= Condition.signalAll ();
次のコードは、synchronizedキーワードを使用します:
パブリック クラス銀行{ 民間 最終 ダブル[] accouts。 プライベートロックbanklock。 民間条件sufficientFunds。 パブリック銀行(整数 nは、二重initialBalance){ accouts = 新しい ダブル[N]。 Arrays.fill(accouts、initialBalance)。 banklock = 新しいReentrantLockの(); sufficientFunds = banklock.newCondition()。 } 公共 同期 ボイド転送(int型から、INT、へダブル量)スローInterruptedExceptionある{ ながら <から(accoutsの)量 )(待ちます。 System.out.println(にThread.currentThread())。 【から】accouts - = 量。 System.out.printf( "%の%dと%dから10.2f、%10.2fまま" 、[から] accouts、への、量)。 accouts [に対する] + = 量。 System.out.printf( "トータルバランス:%10.2f%のN" 、getTotalBalance())。 notifyAll(); } 公共 同期 ダブルgetTotalBalance(){ 二重和= 0 。 用(ダブル:accouts) の合計 + = A; 戻り値の合計。 } 公共 int型のサイズ(){ 戻りaccouts.length。 } }