2012-02-17 12 views
1

は、私は現在のプログラムシングルトンデザインパターンを実装しています。 1つのメソッドは、メソッドの前に同期タグを付けることだけですが、インタビュアーは、メソッドをスレッドセーフにするための他のより効率的な方法があると言いました。スレッド安全な方法

誰でもアイデアを提供できますか?

+4

http://en.wikipedia.org/wiki/Singleton_patternをチェックし、Bill Pughのコードを確認してください(最高のenumを使用しないでください) – asela38

+0

これは[このすばらしい答え]で説明されています(http://stackoverflow.com/question/9239832/need-information-on-single-class-in-java/9239856#9239856)と非常によく似た質問 – Bohemian

答えて

1

少なくとも3つは私が考えることができますが、それらのうちの2つは同じ原則に沸きます。

基本的に、クラスローダーはスレッドセーフについて心配するか、Java5以降のダブルチェックロックを使用できます。

最初のバージョンは、実際のコードを含む内部クラス/列挙型を意味します.2番目は、シングルトンインスタンスをvolatileにし、通常のif-synchronize-ifソリューションを使用します。

1

ああ私の言葉、これはまたありません。同期ゲッターを作ることは次善の策である

public class Singleton { 
    private static Singleton s = new Singleton(); 
    // ... 
} 

これを書くための非常に最良の方法は、最も簡単です。それを行うにはさらに複雑な方法がいくつかありますが、そのどれも努力する価値はありません。​​は非常にです。

+0

同期*正しい状況で安くすることができますが、高価な。 – Voo

+0

ロックがシングルトンのインスタンス化を保護している場合、実際の競合は、実際のインスタンス化が発生したときにただ1つの瞬間に発生する可能性があります。その後、それはすべて肉汁だ。 –

+2

しかし、あなたのソリューション( "メソッドの同期化")では、メソッドが呼び出されるたびに、インスタンス化の後でも同期がとれます。つまり、ロックが争われていると、重いロックと高価なロックが発生します。 – Voo

関連する問題