1. 同期型と静的同期型の違い
同期型は、クラスの現在のインスタンスをロックして、他のスレッドがクラスのインスタンスのすべての同期されたブロックに同時にアクセスできないようにします。 " とクラスの 2 つ 異なるインスタンスにはそのような制約はありません。次に、静的同期により、クラスのすべてのインスタンスへのアクセスが制御され、スレッドが jvm 内のクラスのすべてのインスタンスに同時にアクセスしたり、対応するコードにアクセスしたりすることが制限されます。実際、クラス内の特定のメソッドまたはコード ブロックに同期がある場合、クラスのインスタンスを生成した後、クラスには監視ブロックがあり、スレッドがインスタンスにアクセスできるようにするために同期保護ブロックが配置されます。同時に、static synchronized は、このクラスのすべてのインスタンスが共通のモニターを共有します。これが 2 つの違いです。つまり、synchronized は this.synchronized と同等であり、
static synchronized は Something.synchronized と同等です。
著者 Jie Chenghao の「Java More」スレッド設計パターンには、次のような例があります。 pulbic クラス Something() を使用して使用します ‑ ‑ public synchronized void isSyncB(){}
cSyncB(){}
}
では、Something クラスの 2 つのインスタンス a と b が追加された場合、次のグループ メソッドはなぜ同時に複数のスレッドからアクセスされるのでしょうか
a. x.isSyncA() と x.isSyncB()
b. x.isSyncA() y.isSyncA()
c. x.cSyncA() と y.cSyncB()
d. x.isSyncA() と Something.cSyncA()
ここで、これらはすべて同じインスタンスの同期されたドメインにアクセスします。 b. それらは異なるインスタンス用であるため、同時にアクセスできます。 c. 異なるインスタンスは依然として制限されます (Something.isSyncA()。 ) と Something.isSyncB() があるため、同時にアクセスすることはできません。
では、d はどうでしょうか? この本の答えは同時にアクセスできます。その理由は、同期されたインスタンス メソッドと同期されたクラス メソッドには異なるロックがあるためです。
個人的な分析では、同期と静的同期は 2 つのギャングに相当し、それぞれが独自の業務を担当しており、同時にアクセスできます。 Java の内部設計の同期がどのように実装されるかはまだ明らかではありません。
結論: A: synchronized static は特定のクラスのスコープであり、synchronized static cSync{} は、複数のスレッドがこのクラスの synchronized static メソッドに同時にアクセスすることを防ぎます。これは、クラスのすべてのオブジェクト インスタンスに対して機能します。 N y B: Synchronized はインスタンスのスコープです。 Synchronized issync () {} は、複数のスレッドがこのインスタンスの synchronized メソッドに同時にアクセスすることを防ぎます。
2. 同期メソッドと同期コードの違い
3. 同期したキーワードは継承できません