簡體   English   中英

單例方法線程安全

[英]Singleton methods thread safe

我有一個問題,單例模式和線程。 實現是這樣的。

public class Singleton {
    private static final Singleton instance = new Singleton();

    private SomeClass someField;
    // and  another private fields

    private Singleton() {
        someField = new SomeClass(some args);
        // init another private fields
    }

    public Singleton getInstance() {
        return instance;
    }

    public void operation() {
        //some operations
        someField.method();
    }
}

(很抱歉,我無法提供真實的示例。)接下來的問題是:方法operation()線程安全嗎?

我們不知道它是否安全-我們不知道someField.method()作用。

我強烈建議您將someFieldfinal字段,就好像單例需要更改狀態一樣,那么如果沒有額外的同步它絕對不是線程安全的。 如果SomeClass本身是不可變的並且是線程安全的,則您不需要任何其他同步-否則,您將需要。

基本上,單例沒有“魔術般線程安全”的特性。 它只是一個實例,多個線程將通過靜態getInstance()方法訪問。 如果該類是線程安全的,則無論它是否是單例的,它都是線程安全的;並且,如果它不是線程安全的,那么將其設置為單例也無濟於事。

someField.method();的線程安全性 取決於實際操作。 如果它是在多個線程之間共享的修改狀態,則它不是線程安全的。 如果不是,則可能是線程安全的。 但通常不應假定它是線程安全的。 沒有代碼,我不能說更多。

答案不是上面回答的線程安全。 可以作為下面的代碼進行測試!


public class TestSingleton {
public static void main(String[] args) throws Exception {
    ExecutorService pool = Executors.newFixedThreadPool(10);
    for (int j = 0; j < 100000; j++) {
        pool.submit(new Thread() {
            public void run() {

                Singleton.get().add();
            }
        });
    }
    pool.shutdownNow();
    System.out.println(Singleton.get().getcnt());
}

}

class Singleton {
private static Singleton singleton = new Singleton();

int cnt = 0;

private Singleton() {}

public static Singleton get() {
    return singleton;
}

public void add() {
    cnt++;
}

public int getcnt() {
    return cnt;
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM