Java のインターフェイスと抽象クラスの同期メカニズム: インターフェイスと抽象クラスはインスタンス化できず、独自のロックを持つこともできません。同期メソッドを宣言できます。これは通常のメソッドと似ていますが、synchronized キーワードを使用して変更できます。同期されたメソッドが呼び出されると、スレッドはそのメソッドのロックを取得し、同時に同じメソッドを呼び出す他のスレッドは、ロックが解放されるまでブロックされます。実際のケース: 共有リソース クラス SharedResource には 2 つの同期メソッドがあります。ただし、メソッドの同期のため、スレッドは値の正確性を確保して同時実行を回避するために、ロックへのアクセスを待機する必要があります。問題。
#Java におけるインターフェイスと抽象クラスの同期とロックのメカニズム
#はじめに
同期は、複数のスレッドによる共有リソースへの安全なアクセスを保証するメカニズムです。 Java では、ロックを使用して同期を実現できます。ロックは、スレッドがロックを要求したときに、ロックが解放されるまで他のスレッドがリソースにアクセスすることをブロックするオブジェクトです。インターフェイスと抽象クラスの同期
インターフェイスと抽象クラスはインスタンス化できないため、独自のロックを持つことができません。ただし、同期メソッドを宣言できます。これは通常のメソッドとよく似ていますが、synchronized キーワードを使用して変更されます。
public interface SynchronizedInterface { synchronized void synchronizedMethod(); } public abstract class SynchronizedAbstractClass { synchronized void synchronizedMethod(); }
実際的なケース
共有リソース クラスSharedResource について考えてみましょう。このクラスには、
increment と
の 2 つの同期メソッドがあります。デクリメント###。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:java;toolbar:false;'>public class SharedResource {
private int value = 0;
public synchronized void increment() {
value++;
}
public synchronized void decrement() {
value--;
}
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
現在、
と Thread2
という 2 つのスレッドがあり、同時に SharedResource
にアクセスします。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:java;toolbar:false;'>public class Thread1 implements Runnable {
private SharedResource sharedResource;
@Override
public void run() {
for (int i = 0; i < 100000; i++) {
sharedResource.increment();
}
}
}
public class Thread2 implements Runnable {
private SharedResource sharedResource;
@Override
public void run() {
for (int i = 0; i < 100000; i++) {
sharedResource.decrement();
}
}
}
public class Main {
public static void main(String[] args) {
SharedResource sharedResource = new SharedResource();
Thread1 thread1 = new Thread1();
Thread2 thread2 = new Thread2();
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final value: " + sharedResource.value);
}
}</pre><div class="contentsignin">ログイン後にコピー</div></div>この場合、2 つのスレッドが </p>increment<p> メソッドと <code>decrement
メソッドを並行して呼び出しますが、これらのメソッドは同期されているため、各スレッドは value# を変更しています。 ## 事前にロックへのアクセスを待つ必要があります。これにより、
value の値が常に正しいことが保証され、同時実行の問題は発生しません。
以上がJava のインターフェイスと抽象クラスの同期とロックのメカニズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。