1. ホーム
  2. java

javaのstatic synchronizedメソッドの使い方は?

2023-10-16 14:36:09

質問

一つ質問があります。静的同期メソッドはクラスオブジェクトをロックし synchronizedメソッドはオブジェクトの現在のインスタンスをロックします。では ロックされる はどのような意味を持つのでしょうか?

誰もがこのトピックで私を助けてくださいすることができますか?

どのように解決するのですか?

一般的には synchronized メソッドは、同時にアクセスされるリソースへのアクセスを保護するために使用されます。同時にアクセスされるリソースがクラスの各インスタンスに属している場合、クラス内で synchronized インスタンスメソッドを使用します。リソースがすべてのインスタンスに属する場合 (つまり、リソースが static 変数にある場合) は synchronized static メソッドを使ってアクセスします。

例えば static ファクトリーメソッドは、それが生成したすべてのオブジェクトの "registry" を保持します。そのようなレジストリのための自然な場所として static コレクションになります。ファクトリーが複数のスレッドから使用される場合、ファクトリーメソッドを synchronized を実装する必要があります (あるいは synchronized ブロックに入れる) ことで、共有の static コレクションへのアクセスを保護します。

を使うことに注意してください。 synchronized を使用することは、他の人が書いたコードで使用されるライブラリを構築している場合、一般的に最も安全な選択ではありません。なぜなら、悪意のあるコードがあなたのオブジェクトやクラスに対して同期をとり、あなた自身のメソッドの実行をブロックする可能性があるからです。このような事態からコードを保護するには、インスタンスまたは静的なプライベートロックオブジェクトを作成し、代わりにそのオブジェクト上で同期をとるようにします。