コンストラクターの同期には、一度に 1 つのスレッドだけがコードの特定のセクションを実行できるようにすることが含まれます。コンストラクターのコンテキストでは、これは、指定されたオブジェクトのコンストラクター コードを 1 つのスレッドだけが実行できるようにすることを意味します。
マルチスレッド環境では、複数のスレッドがクラスのインスタンスを同時に作成しようとする場合があります。コンストラクターが共有リソースを変更したり、重要な操作を実行したりする場合、不整合やリソースの競合を避けるために同期が必要になる場合があります。
synchronized キーワードを使用してコンストラクターを同期できます。基本的な例を次に示します:
public class SynchronizedConstructorExample { public SynchronizedConstructorExample() { synchronized (this) { // Critical section: code that must be executed by only one thread at a time System.out.println("Constructor is synchronized: " + Thread.currentThread().getName()); // Simulate a delay try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
この例では、synchronized (この) ブロックにより、一度に 1 つのスレッドのみがコンストラクターを実行できるようになります。
コンストラクターを同期すると同時アクセスの問題を防ぐことができますが、慎重に使用しないとパフォーマンスのボトルネックにつながる可能性があります。特に同時実行性の高いシナリオでは、関係するトレードオフを理解することが重要です。
以下は、複数のスレッドでコンストラクターの同期がどのように機能するかを示す実際的な例です。
public class SynchronizedConstructorExample { public SynchronizedConstructorExample() { synchronized (this) { System.out.println("Constructor is synchronized: " + Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { Runnable task = () -> { new SynchronizedConstructorExample(); }; Thread t1 = new Thread(task, "Thread-1"); Thread t2 = new Thread(task, "Thread-2"); t1.start(); t2.start(); } }
上記のコードを実行すると、コンストラクターの実行が 2 つのスレッド間で同期していることがわかります。出力で示されているように、コンストラクターを実行できるのは一度に 1 つのスレッドのみです:
Constructor is synchronized: Thread-1 Constructor is synchronized: Thread-2
出力は、各スレッドが他のスレッドがコンストラクターの実行を完了するのを待ってから続行することを示しています。
同期は必ずしも必要というわけではありません。次の場合に推奨されます:
コンストラクターを同期する代わりに、次のことを検討してください。
コンストラクターの同期は、オブジェクト作成時にスレッドの安全性を管理する効果的な方法ですが、慎重に行う必要があります。同期の選択は、アプリケーションの特定のニーズとコンストラクターで実行される操作の性質に基づいて行う必要があります。
このトピックについてご質問がある場合、またはさらに詳しい説明が必要な場合は、お気軽に以下にコメントを残してください。
で投稿の詳細をお読みください: Java でコンストラクターを同期できますか?
以上がJava でコンストラクターを同期できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。