8

Web Application 内にこの Singleton クラスがあります。

public class MyDAO 
 {


    private static MyDAO instance;

    private MyDAO() {
    }

    public static MyDAO getInstance() {
        if (instance == null) {
            instance = new MyDAO();
        }
        return instance;
    }

このようにアクセスします

public void get_Data()
{

        MyDAO dao = MyDAO.getInstance();
}

アプリケーションにアクセスするユーザーが 3 人いる場合、MyDAO クラスのオブジェクトはいくつ作成されますか??

ユーザーごとに MyDAO のインスタンスが 1 つありますか??

4

3 に答える 3

5

へのアクセスを同期する必要がありますgetInstance()。そうしないと、一部のスレッドで完全に初期化されていないバージョンが表示される可能性があります。

シングルトン パターンの詳細

同期すると、 にインスタンスが 1 つだけになりますJVM。オブジェクトを参照する変数の数に関係なく。ただし、N 個のサーバーを実行している場合は、それぞれに 1 つのインスタンスがありますJVM。したがって、合計で N インスタンスです。

Java 5.0または古いものを使用しているかどうかを再確認できます。

private static volatile MyDAO();
 public synchronized static MyDAO getInstance() {
    if (instance == null) {
        instance = new MyDAO();
    }
    return instance;

ただし、アプリケーションが常にインスタンスを必要とする場合は、熱心にインスタンス化できます。

private static MyDAO = new MyDAO();

しかし、私は解決策に行きBill Purgeます:

    private static class MyDAOHolder { 
            public static final MyDAO INSTANCE = new MyDAO();
    }

    public static MyDAO getInstance() {
            return MyDAOHolder.INSTANCE;
    }
于 2012-09-22T15:36:21.713 に答える
2

いいえ、JVM ごとに 1 つです。スレッドの安全性に注意してください。

「Effective Java」を読み、シングルトンを適切に作成する方法についての推奨事項に従います。あなたのものではありません。

于 2012-09-22T15:36:35.370 に答える
0

シングルトンの定義である 1 つだけがあります。

インスタンス化を同期するには、使用したい完全なオブジェクトのみを返すようにします。

private static Object semaphore = new Object();
public static MyDAO getInstance() {
    synchronized(semaphore)
        if (instance == null) {
            instance = new MyDAO();
        }
    }
    return instance;
}
于 2012-09-22T15:36:12.387 に答える