2011-07-29 4 views
3

私は1つのメソッドを保持するsinlgetonオブジェクトを持っていますが、魔法使いは同期していません。シングルトンは一度に多くのクライアントからアクセスできます。複数のクライアントがそのオブジェクトにアクセスするとどうなりますか?オブジェクト参照は先着順で提供されますか...つまり、最初のクライアントが最初にオブジェクトを終了するのを待たなければなりませんか、またはメモリ内に同じオブジェクト参照が与えられますか?Javaでのシングルトンの同時アクセス

同期されていないシングルトンのメソッドについて、私は奇妙な気持ちになります。 2人のクライアントが異なるパラメータでSingleton.method(param)を呼び出すと、互いの問題が発生することはありませんか?

答えて

7

あなたのメソッドが共有状態(例えばシングルトンフィールド)を使用しない場合、これは完全に安全です。メソッドのパラメータは、スレッドスタック上で渡されます。スレッドスタックは、スタックに対してローカルで排他的です。

メモリ内の異なる領域で同じコードを実行している2つのプロセッサについて考えてみましょう。

+0

ありがとうございました。しかし、メモリに2つのオブジェクトがない場合(シングルトンのために)、スタック上に同じクラスの2つのメソッドがあるという点はまだ分かりませんでしたか? – WinOrWin

+2

シングルトンオブジェクト(そのインスタンスフィールド)はヒープ上にあります。シングルトンオブジェクトメソッドのコードは、PermGenメモリにあります(オブジェクトではなく、ロードされたクラスごとに1回)。メソッドのパラメータは、すべてのスレッドのローカルでスタックに渡されます。 3つの異なるメモリの場所、私はあなたがそれらについてもっと読むことをお勧めします。 –

3

シングルトンは、クラスのインスタンスが1つだけであることを意味します。シングルトンが正しく実装されていない場合、これは当てはまりません。シングルトンを持つ最も安全な方法は、enumと宣言することです。

同期されていないメソッドがある場合は、複数のスレッドがメソッドの本体を同時に実行できることを意味します。シングルトンが不変の場合、心配はありません。さもなければ、起こり得る矛盾に注意を払うべきです。 1つのスレッドは状態を変更できますが、他のスレッドは同じ結果を出すため、予期しない結果が非常に発生しにくくなります。

関連する問題