Java 関数は、同期メソッドを通じてスレッドの安全性を実現します。同期メソッドは synchronized キーワードを使用します。スレッドが同期メソッドを呼び出すときは、メソッド本体を実行する前に、そのメソッドが属するオブジェクトのロックを取得する必要があります。同じメソッドを呼び出そうとする他のスレッドは、最初のスレッドがロックを解放するまでブロックされます。
Java 関数の同期メソッドでスレッド セーフを実現する方法
マルチスレッド環境で、データの一貫性と整合性を確保するには、共有リソースを同期する必要があります。同期の目的は、1 つのスレッドだけが同時に共有リソースにアクセスできるようにすることです。 Java は、この機能を実装するための同期メソッドを提供します。
同期メソッド
Java のメソッドは、synchronized
キーワードを使用して同期メソッドとして宣言できます。同期メソッドが呼び出されるとき、スレッドはメソッド本体を実行する前に、まずメソッドが属するオブジェクトのロックを取得する必要があります。別のスレッドが同じ同期メソッドを呼び出そうとすると、最初のスレッドがロックを解放するまでブロックされます。
例
次の例は、同期メソッドを使用して共有リソースを保護する方法を示しています:
public class Counter { private int count = 0; // 同步方法 public synchronized void increment() { count++; } }
increment()
このメソッドは同期メソッドとして宣言されています。つまり、このメソッドを同時に実行できるのは 1 つのスレッドだけです。
実際的なケース
次のコードは、共有リソースを保護するために同期メソッドが使用される実際的なケースを示しています。
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class ConcurrentCounterDemo { public static void main(String[] args) throws InterruptedException { // 创建一个共享资源 Counter counter = new Counter(); // 创建一个线程池 ExecutorService executor = Executors.newFixedThreadPool(10); // 提交任务到线程池 for (int i = 0; i < 1000; i++) { executor.submit(() -> counter.increment()); } // 等待所有任务完成 executor.shutdown(); executor.awaitTermination(1, TimeUnit.MINUTES); // 打印计数 System.out.println("最终计数:" + counter.count); } }
この例では、 increment()
メソッドは、共有の count
変数を同時にインクリメントするために使用されます。同期メソッドが使用されていない場合、異なるスレッドが count
変数を同時に変更する可能性があり、最終的なカウントが不正確になる可能性があります。同期メソッドを使用すると、同時に 1 つのスレッドだけが count
変数にアクセスできるようになり、データの一貫性と整合性が確保されます。
以上がJava 関数の同期メソッドでスレッド セーフを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。