Java では、マルチスレッド状況が頻繁に発生し、マルチスレッドによる同時アクセスにより、スレッドの安全性の問題など、いくつかの問題が発生します。したがって、Java には、この問題を解決するためのメカニズムである synchronized キーワードが用意されています。
同期キーワードとは何ですか?
synchronized は、メソッドやコード ブロックを変更するために使用できる Java のキーワードです。メソッドまたはコード ブロックが同期によって変更されると、それらは同期メソッドまたは同期コード ブロックになります。
同期の役割
同期の役割は、複数のスレッドが同じ共有リソースにアクセスするときに、データの不整合やその他のスレッドの安全性の問題が発生しないことを保証することです。スレッドが同期メソッドまたは同期コード ブロックにアクセスする場合、他のスレッドは、現在のスレッドが同期メソッドまたは同期コード ブロックの実行を完了するまで待ってからアクセスする必要があります。
同期の実装原理
同期の実装原理は、オブジェクトをロックすることによって実現されます。スレッドが同期メソッドまたは同期コード ブロックにアクセスすると、オブジェクトのロックを取得しようとします。ロックが他のスレッドによって占有されていない場合、現在のスレッドはロックを取得して、同期されたメソッドまたは同期されたコード ブロックを実行できます。ロックがすでに別のスレッドによって占有されている場合、現在のスレッドはロックを取得する前に、他のスレッドがロックを解放するのを待つ必要があります。
同期の使い方
同期を使用するには、変更されたメソッドと変更されたコード ブロックという 2 つの方法があります。
修正方法
public synchronized void method() {
//方法体
}
スレッドがメソッドにアクセスすると、そのメソッドは同期メソッドになります。他のスレッドは、このメソッドを実行する前に、現在のスレッドがこのメソッドの実行を完了するまで待つ必要があります。
コードブロックを装飾する
public void method() {
synchronized (this) {
// 多线程资料
System.out.println("https://cloud.fynote.com/share/d/IYgHWTNAA");
}
}
スレッドがコード ブロックにアクセスすると、コード ブロックは同期されたコード ブロックになります。他のスレッドは、コード ブロックを実行する前に、現在のスレッドがコード ブロックの実行を完了するまで待つ必要があります。
同期のメリットとデメリット
アドバンテージ
シンプルで使いやすい: synchronized を使用すると、マルチスレッド同期を簡単に実現できます。
高い信頼性: synchronized は、マルチスレッドのセキュリティを確保できる Java の組み込みメカニズムです。
幅広く適用可能: synchronized はメソッドやコード ブロックの変更に使用でき、さまざまな状況に適用できます。
欠点がある
低効率: 同期は悲観的なロックであり、他のスレッドの実行をブロックするため、効率が低下します。
デッドロックを引き起こしやすい: 同期は不適切に使用すると、デッドロックの問題を引き起こす可能性があります。
要約する
Synchronized は、マルチスレッドの同時アクセスの問題を解決するために使用される Java のメカニズムで、複数のスレッドが同じ共有リソースにアクセスするときに、データの不整合やその他のスレッドの安全性の問題が発生しないことを保証します。ただし、同期には効率が低く、デッドロックが発生しやすいなどの欠点もあります。したがって、同期を使用する場合は、無用な問題を避けるために、使用方法と使用シナリオに注意する必要があります。