Java のスレッド同期と相互排他メカニズム
Java では、マルチスレッドは重要なテクノロジです。複数のタスクを同時に効率的に実行するには、スレッド間の同期および連携メカニズムを習得する必要があります。この記事では、Java のスレッド同期と相互排他メカニズムを紹介します。
スレッド同期とは、実行中に指定されたタスクを完了するために複数のスレッドが連携することを指します。複数のスレッドで実行されるコードセグメントは共有リソースに相互にアクセスするため、コードの実行後は 1 つのスレッドのみが共有リソースにアクセスでき、他のスレッドは待機する必要があります。スレッドの同期は、次の基本原則に従います。
(1) 原子性: コードの特定の部分には、同時に 1 つのスレッドのみがアクセスできます。
(2) 再入可能: スレッドが同期ブロックを複数回実行する場合、スレッドはすでにロックを保持しているため、ロックされません。
Java では、同期を維持する方法が 2 つあります。それは、同期とロックです。
1.1 synchronized
synchronized は、Java の最も基本的な同期メカニズムです。 synchronized 同期ブロックの形式は以下のとおりです。
synchronized (object) {
//コードセグメント
}
このうち、オブジェクトは共有リソースです。オブジェクト メソッドやオブジェクト自体など、同期する必要があるもの。 synchronized キーワードによって変更されたコード ブロックに同時にアクセスできるスレッドは 1 つだけです。例:
public synchronized void method(){
//代码
}
上記のコード例では、method() メソッドが synchronized キーワードで変更されており、このメソッドを同時に実行できるスレッドは 1 つだけです。マルチスレッドでは、このメソッドにアクセスするスレッドが同期していることが保証されます。
1.2 ロック
ロック メカニズムは、よりきめ細かいロック制御を提供します。 Lock は Java のインターフェイスであり、Lock インターフェイスのサブクラスである ReentrantLock によって実装されています。Lock ロックの使用方法は synchronized キーワードに似ていますが、使用方法はより柔軟です。ロック メカニズムを使用する場合、ロックの取得と解放に必要なコード セグメントは、try およびfinally コード ブロックに含まれます。例:
Lock lock = new ReentrantLock();
lock.lock();
try {
//代码段
}finally {
lock.unlock();
}
上記のコードでは、lock() メソッドを使用して共有リソースをロックし、unlock() メソッドを使用してロックを解放します。ロック機構はよりきめ細かいロック制御を備えているため、特定の高パフォーマンスの状況により適しています。
相互排他メカニズムとは、マルチスレッドの実行中に 1 つのスレッドだけが共有リソースに同時にアクセスできるようにすることを指します。 Java では、相互排他メカニズムを実装する方法として、同期とロックの 2 つがあります。
2.1 synchronized
synchronized synchronized ブロックは、スレッドの同期を実現するだけでなく、相互排他メカニズムも実装できます。 synchronized を使用して相互排他メカニズムを実装するコード例は次のとおりです。
public synchronized void method(){
//代码段
}
上記のコードでは、synchronized 同期をメソッド キーワードの前に追加すると、同時に 1 つのスレッドだけがこのコードにアクセスできるようになり、相互排他メカニズムが実装されます。
2.2 Lock
LockAPI ライブラリで提供される相互排他メカニズムを使用して、相互排他メカニズムを実装することもできます。 Lock メカニズムを使用して相互排他メカニズムを実装するコード例は次のとおりです。
private Final Lock lock = new ReentrantLock();
public void method() {
lock.lock(); try { //代码段 } finally { lock.unlock(); }
}
上記のコードでは、lock()メソッドで共有リソースをロックし、unlock()メソッドでロックを解除することで相互排他機構を実現しています。
synchronized synchronized block と Lock メカニズムはどちらもスレッド同期と相互排他メカニズムを実装できますが、両者の間にはいくつかの違いがあります。二つ。 。
(1) 異なる粒度: synchronized 同期ブロックはより大きな粒度を持ちますが、Lock メカニズムは Lock インターフェイスを通じてより小さな粒度を提供します。Lock メカニズムを使用すると、より個人化されたロックを定義し、ロックを制御することもできます。 。
(2) 可視性の違い: 同期された同期ブロックを使用する場合、一方のスレッドがロックを所有している場合、もう一方のスレッドはロックを認識できないため、ロックの解放を独立して制御できません。 Lock メカニズムを使用すると、スレッドがロックを取得すると、そのロックがすべてのスレッドに表示され、ロックの解放を制御できます。
要約すると、Java のスレッド同期と相互排他メカニズムは、マルチスレッド プログラミングにおいて非常に重要なメカニズムです。アプリケーションのシナリオが異なれば、異なる同期および相互排他メカニズムの使用が必要になるため、適切なメカニズムを選択すると、マルチスレッド アプリケーションの実行効率が大幅に向上します。
以上がJava のスレッド同期と相互排他メカニズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。