情報を含むいくつかのベクトルを保持する静的クラスを作成しています。誰かがベクターを編集または読み取っている場合にクラスがロックされるように、同期させる必要があります。
これを行うための最良の方法は何ですか?
次のようにクラス内で同期される関数があれば十分ですか。
public synchronized insertIntoVector(int id)
{
}
前もって感謝します :)
情報を含むいくつかのベクトルを保持する静的クラスを作成しています。誰かがベクターを編集または読み取っている場合にクラスがロックされるように、同期させる必要があります。
これを行うための最良の方法は何ですか?
次のようにクラス内で同期される関数があれば十分ですか。
public synchronized insertIntoVector(int id)
{
}
前もって感謝します :)
まず、「静的クラス」の意味を正確に定義する必要があります。最初は、すべてのメソッドが静的である(インスタンス化されることを意図していない)クラスを意味していると思いましたが、コードスニペットはそうではないことを示しています。
いずれの場合も、クラス内の同期メソッドは、synchronized(this)
インスタンスメソッドである場合、またはsynchronized(TheContainingClassName.class)
静的メソッドである場合と同等です。
すべての静的メソッドを使用してインスタンス化できないクラスを作成する場合、またはシングルトンとして機能するクラスを作成する場合、クラスのすべてのメソッドを同期すると、一度に1つのスレッドのみがメソッドを呼び出すことができます。
ただし、可能であれば、メソッドがアトミックであることを確認してください。異なるメソッドへの呼び出しは他のスレッドによってインターリーブされる可能性があるため、(おそらくfoo変数をインクリメントした後の)getFoo()
呼び出しの後にsetFoo()
別のスレッドが呼び出された場合、望ましい効果が得られない可能性がありますsetFoo()
。最善のアプローチは、次のような方法を使用することincrementFoo()
です。または(これが不可能な場合)、同期の詳細を公開して、呼び出し元が一連の呼び出し全体でクラス/インスタンスを手動でロックできるようにすることもできます。
AFAIK、Javaには「静的クラス」のようなものはありません。静的メソッドのみを含むクラスを意味しますか?もしそうなら、
public static synchronized void insertIntoVector(int id) {
}
静的メソッドのみがあり、それらすべてが同期されている場合は、クラスオブジェクトに関して同期します。これで十分です。
静的内部クラスを意味する場合(「静的」という単語は静的メソッドとは異なる意味を持ちます)、
public synchronized void insertIntoVector(int id)
{
}
その静的内部クラスのインスタンスに関して同期します。