>synchronized
synchronized キーワード。synchronized メソッドと synchronized ブロックの 2 つの使用法が含まれます。
1>synchronized メソッド: メソッド宣言に synchronized キーワードを追加して、synchronized メソッドを宣言します。
public synchronized void accessVal(int newVal);
同期メソッドはクラス メンバー変数へのアクセスを制御します。各クラス インスタンスはロックに対応し、各同期メソッドはメソッドを呼び出すクラス インスタンスのロックを取得する必要があります。そうでない場合、メソッドが実行されると、そのスレッドはロックを排他的に占有し、その後、ブロックされたスレッドはロックを取得して再入することができます。実行可能な状態。このメカニズムにより、各クラス インスタンスに対して、同期済みとして宣言されたすべてのメンバー関数のうち最大 1 つが実行可能状態になることが保証されます (クラス インスタンスに対応するロックを取得できるのは最大 1 つであるため)。クラスメンバーが変数の競合にアクセスできるようにします (クラスメンバー変数にアクセスできるすべてのメソッドが同期済みとして宣言されている限り)
Javaではクラスインスタンスだけでなく、各クラスもロックに対応しているため、静的メンバー関数も宣言できますクラスの静的メンバー変数へのアクセスを制御するために同期されます。同期メソッドの欠点: 大きなメソッドが同期済みとして宣言されている場合、通常、スレッド クラスのメソッド run() が同期済みとして宣言されている場合、スレッドのライフ サイクル全体にわたって実行され続けます。 . このクラスの同期メソッドへの呼び出しは失敗します。もちろん、クラス メンバー変数にアクセスするコードを特別なメソッドに組み込み、それを synchronized として宣言し、main メソッドで呼び出すことでこの問題を解決できますが、Java はより良い解決策、つまり synchronized ブロックを提供します。
2> 同期ブロック: synchronized キーワードを通じて同期ブロックを宣言します。文法は次のとおりです:
// 許可されたコード}}
Synchronized ブロックは、コード ブロックでオブジェクト Syncobject を取得する必要があります (前述したように、クラス インスタンスまたはclass) ロックを実行することができ、具体的な仕組みは上記と同じです。任意のコードブロックを対象とし、ロック対象を任意に指定できるため、柔軟性が高い。
synchronized(this) についての理解:
1. 2 つの同時スレッドが同じオブジェクト内の synchronized(this) 同期コード ブロックにアクセスする場合、一度に 1 つのスレッドのみを実行できます。別のスレッドは、このコード ブロックを実行する前に、現在のスレッドがこのコード ブロックの実行を完了するまで待つ必要があります。
2. ただし、スレッドがオブジェクトの同期された (この) 同期コード ブロックにアクセスするとき、別のスレッドは引き続きオブジェクト内の非同期 (この) 同期コード ブロックにアクセスできます。
3. 特に重要なのは、スレッドがオブジェクトの synchronized(this) 同期コード ブロックにアクセスすると、オブジェクト内の他のすべての synchronized(this) 同期コード ブロックへの他のスレッドのアクセスがブロックされることです。