Javaの最も基本的な同期方法は、同期されたキーワードを使用して、メソッドの同時アクセスを制御することです。同期されたキーワードで宣言されたすべての方法は、重要なセクションです。 Javaでは、同じオブジェクトの重要なセクションの1つだけが同時にアクセスできます。
静的方法には異なる動作があります。同期されたキーワードで宣言された静的メソッドは、1つの実行スレッドでのみアクセスできますが、他のスレッドはこのオブジェクトの非静的同期メソッドにアクセスできます。 2つのスレッドがオブジェクトの2つの異なる同期されたメソッドに同時にアクセスできるため、これは非常に慎重でなければなりません。つまり、1つは静的同期方法であり、もう1つは非静的同期方法です。両方のメソッドが同じデータを変更すると、一貫性のないエラーが発生します。
同期ブロックの構文は次のとおりです。
public void method(){synchronized(expression){}}同期されたキーワードには2つの用途があります。 1つはメソッドの定義でのみ使用され、もう1つは同期ブロックです。 Synchronizedを使用してオブジェクト変数を同期するだけでなく、SynchronizedLを使用して、クラスの静的メソッドと非静的メソッドを同期することもできます。
最初:非静的な方法の同期
Java関連の構文から、同期されたキーワードを使用してメソッドを定義すると、ClassのSynchroniezdキーワードで定義された静的メソッドと非静的メソッドがロックされることがわかりますが、これは少し困難です。このような効果を達成するためにブロックを同期したい場合、この効果が生成される理由を理解することは難しくありません。同期を使用してクラス内のすべての同期された非静的メソッドをロックする場合、これを同期ブロックのパラメーターとして使用して同期ブロックに渡す必要があります。コードは次のとおりです。
public class test {public void method1(){synchronized(this){}} public synchronized void method2(){}} public class test {public void method1(){synchronized(this){}} public synchronized void method2(){}}}}}}上記のコードでは、Method1は同期ブロックを使用し、Method2 Methodは同期されたキーワードを使用してメソッドを定義します。同じテストインスタンスを使用する場合、これら2つの方法のいずれかが実行されている限り、同期ロックが取得されていないため、他のメソッドがブロックされます。これを同期ブロックのパラメーターとして使用することに加えて、テストを使用することもできます。これは、同期ブロックのパラメーターとして同じ効果を実現します。
内部クラスで同期したブロックを使用する際、これは内部クラスのみを表し、外側クラス(アウタークラス)とは関係ありません。ただし、内部クラスの非静的な方法と外側クラスの非静的な方法も同期することができます。メソッドメソッド3を内部クラスに追加すると、テストの2つのメソッドと同期することもできます。コードは次のとおりです。
public class test {class innerclass {public void method3(){synchronized(test.this){}}} public class test {class innerclass {public void method3(){synchronized(test.this){}}}}}}上記のインナークラスのMethod3メソッドとMethod1およびMethod2テストの方法では、同時に1つのメソッドを実行できます。
同期ブロックが正しく実行されるか、プログラムエラーによる例外のために同期ブロックが終了するかどうかにかかわらず、現在の同期ブロックが保持する同期ロックは自動的にリリースされます。したがって、同期ブロックを使用する場合、同期ロックを心配する必要はありません。
2。静的法の同期
静的メソッドを呼び出すときにオブジェクトインスタンスは必ずしも作成されるわけではないため、これは静的メソッドを同期するために使用することはできませんが、クラスオブジェクトを使用して静的メソッドを同期する必要があります。コードは次のとおりです。
public class test {public static void method1(){synchronized(test.class){}} public static synchronized void method2(){}} public static void method1(){synchronized(test.class){}} public static synchronized void method2(){){}}静的メソッドを同期する場合、クラスの静的フィールドクラスを使用してクラスオブジェクトを取得できます。上記の例では、Method1とMethod2 Methodのメソッド実行が1つしかありません。クラスフィールドの使用に加えて、インスタンスのgetClass()メソッドを介してクラスオブジェクトを取得することもできます。コードは次のとおりです。
パブリッククラステスト{public staticテストテスト。 public test(){test = this; } public static void method1(){synchronized(test.getClass()){}} public class test {public staticテストテスト; public test(){test = this; } public static void method1(){synchronized(test.getClass()){}}}}
上記のコードでは、public staticオブジェクトを介してテストのインスタンスを取得し、このインスタンスのGetClassメソッドを使用してクラスオブジェクトを取得します(クラスのすべてのインスタンスはGetClassメソッドを使用して取得されることに注意してください)。また、クラスを通じてさまざまなクラスの静的メソッドを同期することもできます。コードは次のとおりです。
public class test1 {public static void method1(){synchronized(test.class){}}} public class test1 {public static void method1(){synchronized(test.class){}}}}}
注:同期されたブロックを使用してメソッドを同期する場合、非静的メソッドはこれを介して同期することができますが、静的メソッドはクラスオブジェクトを使用して同期する必要がありますが、クラスを使用して非静的メソッドも同期することもできます。ただし、これは静的な方法で使用して非静的な方法を同期させることはできません。これは、同期ブロックを使用する場合に注意する必要があります。
注記
同期されたキーワードは、アプリケーションのパフォーマンスを分解するため、同時シナリオで共有データを変更する必要があるメソッドでのみ使用できます。複数のスレッドが同じ同期されたメソッドにアクセスすると、1つのスレッドのみがアクセスでき、他のスレッドが待機できます。メソッド宣言が同期されたキーワードを使用しない場合、すべてのスレッドは同時にメソッドを実行できるため、合計実行時間が短縮されます。複数のスレッドで呼び出されることがわかっている場合は、同期されたキーワードを使用して宣言する必要はありません。
同期されていると宣言された方法は、再帰的に呼び出すことができます。スレッドがオブジェクトの同期メソッドにアクセスすると、再度メソッドへのアクセスを取得することなく、実行方法を含むオブジェクトの他の同期メソッドを呼び出すこともできます。
同期されたキーワードを介して(メソッド全体ではなく)コードブロックへのアクセスを保護できます。同期されたキーワードは次のように使用する必要があります。メソッドの残りの部分は、パフォーマンスを向上させるために同期コードブロックの外側に残ります。重要なセクション(つまり、1つのスレッドでのみアクセスできるコードブロック)へのアクセスは、できるだけ短くする必要があります。たとえば、建物内の人の数を取得する際には、同期されたキーワードのみを使用して、人数を更新するための指示を保護し、共有データを使用しない他の操作にします。この方法で同期されたキーワードを使用する場合、オブジェクト参照は着信パラメーターとして使用する必要があります。この同期コードに同時にアクセスできるスレッドは1つだけです。一般的に言えば、このキーワードを使用して、実行されるメソッドが属するオブジェクトを参照してください。
同期(this){// javaコード}