正しい使い方は同期化したシングルトン?
-
13-09-2019 - |
質問
私が考える建物の趣味でプロジェクトは、offのようなことがいえるでしょう、ブラッシュアッププログラミング/デザイン。
では基本的にはマネジ付きウェブスパイダー、更に同じデータ構造のオブジェクト->int.
では失わせないアイテム用のデータベースのためこのことだけを考えついたことは、スレッドセーシングルトンの使用を含むデータ構造です。 http://web.archive.org/web/20121106190537/http://www.ibm.com/developerworks/java/library/j-dcl/index.html
あとは異なるアプローチかにするべきである。
解決
ダブルチェックロッキングは(少なくともとしてJavaで)正しくないと欠陥であることが証明されました。検索を行うか、正確な理由のために Wikipediaのエントリを見てください。
何よりもまず、プログラムの正しさです。あなたのコードは、スレッドセーフ(マルチスレッド環境では)されていない場合、それは壊れています。正確には、パフォーマンスの最適化の前に最初に来ます。
正しいことを、あなたは全体のgetInstance
メソッドを同期する必要があります。
public static synchronized Singleton getInstance() {
if (instance==null) ...
}
または静的に初期化する
private static final Singleton INSTANCE = new Singleton();
他のヒント
使用流を初期化のためのデータベースのwebクローラーはれていないことが考えられない内容であることを期待する。怠け者の初期化の複雑さに加え、継続的に速ます。一例では正当化される場合があり良いチャンスのデータはないが必要になります。また、対話的なアプリケーションでの軽減に使用される起動時間の 錯覚 の速度です。
非対話的なアプリケーションのようなウェブ-クローラーは、確実に必要なデータベースに存在するのぐのぐさの初期化は貧しいです。
一方、インターネット上でのクローラーを簡単にparallelizable、大きな利益を得られるマルチスレッド.そのまま使用すると運動の定 java.util.concurrent
図書館に極めて価値がある。具体的には、 ConcurrentHashMap
や ConcurrentSkipListMap
, のための複数のスレッドが読みや更新を共有。
きんぐさの初期化は、単純なシングルトンパターンのようなこと:
class Singleton {
static final Singleton INSTANCE = new Singleton();
private Singleton() { }
...
}
キーワード final
のです。ものを提供する場合 static
"ゲッター"のシングルトンではなく可能に直接フィールドアクセス、シングルトン final
るため正確でより積極的な最適化による、JITコンパイラです。
場合致命的な欠点が数マイクロ秒単位でそのままの最適化と資源のロックが実は問題.
その場合、キーワードはこちら ホビープロジェクト!
この場合は同期の getInstance() 方法をおさま、おめでとうございます、99.9%のがあります。りませんが、その他。
その後、場合の証明によるプロファイリングの getInstance() 同期がボトルネックのプロジェクト、などができるようになり、最適な並行処理.がんの疑い影響を与えてしまうことにもなります。
Jeach!
試しに Billピュー 溶液の初期化要求に応ホルダム.のソリューションには、最も携帯型の異なるJavaコンパイラおよび仮想マシン.のスレッドの安全な言語を構築します(揮発性および/または同期化).
http://en.wikipedia.org/wiki/Singleton_pattern#The_solution_of_Bill_Pugh
私はまた、単一要素列挙型は、シングルトンを実装するための最良の方法であることに同意します。
public enum Singleton {
INSTANCE;
public void doSomething() { ... }
}
見れば、下の記事だけるとの提案にもstaticフィールドに代入します。い私の傾角:ご不要なのかもしれませんlazyインスタンス生成(必要ありません getInstance()
きの両方のアクセス用メソッドおよび工法です。だいたいできることを確実にするために、一つだけのことに頼もしく感じました。場合に必要な情報であるグローバルへのアクセスなども、今までの利用 このコードサンプルの方にも底:
class Singleton
{
private Vector v;
private boolean inUse;
private static Singleton instance = new Singleton();
private Singleton()
{
v = new Vector();
inUse = true;
//...
}
public static Singleton getInstance()
{
return instance;
}
}
なお、シングルトンは現在建設のインストール中に静ます。この作品は、スレッドのリスクが潜在的に誤同調しています。
すべてとはいえ、もう本当に必要のスレッドの安全なデータ構造の近代JDKs.例えば、私の大ファン ConcurrentHashMap:スレッドの安全性プラスないし、コードを書く(FTW!).
なぜあなたは依存性注入として、各スレッドに渡すデータ構造を作成しないでください。そうすれば、あなたは、シングルトンを必要としません。あなたはまだスレッドセーフにする必要があります。
あなたはシングルトンオブジェクトの作成を行うことについての唯一の協議を参照記事、この場合は、おそらくコレクション、スレッドセーフ。予想通りコレクション操作も動作するように、また、スレッドセーフなコレクションを必要としています。シングルトンでの基礎となるコレクションは、おそらくのConcurrentHashMap 。
この記事をチェックしてください C#でSingletonパターンを実装する
public sealed class Singleton
{
Singleton()
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
いかがます:
public static Singleton getInstance() {
if (instance == null) {
synchronize(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}