簡體   English   中英

java中的Singleton類或實例

[英]Singleton class or instance in java

我知道在Spring框架中,bean的默認范圍是Singleton。 這意味着每個容器只創建一個bean實例。

但我幾乎無法理解以下情況。

對於示例類,假設類“SingleTonClass”在spring context.xml中配置為singleton bean,1)每次有對此類的請求時,它是否使用相同的實例。 如果是,那么如果我調用new SingleTonClass().sum(3,4)來自另一個類的new SingleTonClass().sum(3,4)new SingleTonClass().sum(5,6) ,將正確地給我結果或者有時會出現問題?

2)如果所有請求都使用相同的實例,那么幕后如何才能使用所有請求只使用一個實例? 如果有100個請求到同一個單例類,每個請求必須等到上一個請求完成?

編輯:

假設我使用的是@Autowired,而不是新的運算符

在我的主類中,我正在嘗試使用spring配置的bean。 假設MyMain被多次調用(可能是也可能不是並發調用),我想在上面的帖子中理解第2點(編輯)

public class MyMain() {

@Autowired
SingleTonClass singleTonClass;

}




   public class SingleTonClass {

    private int a=0;
    private int b=0;

    public int sum(int a ,int b) {

    return a+b;
    }
  }

當您執行new SingleTonClass()您將始終獲得該類的新副本。 要使用Spring實例化功能,您需要讓Spring為您進行配置,例如使用@Autowired注釋。

對於多個請求同時命中單個實例的問題,您必須使您的類無狀態或線程安全。 這是一個無法簡單回答的主題,但您可以從這里開始

您需要編寫無狀態bean(意味着bean中不應該有任何數據存儲),以免擔心線程安全。 或者你需要自己處理線程安全。 默認情況下,Spring會創建類的單例非線程安全實例。 甚至“原型”范圍也不是線程安全的。 當你將范圍定義為原型時,它只是意味着每次將spring 注入另一個組件時spring將創建一個新實例,而不是每次執行這些組件時都會創建一個實例。

例如,A類在兩個組件中注入bean a1和a2。 SpringContext中只有兩個實例,即使這些組件提供了數百萬個請求。

請參閱此問題 ,詳細了解您可以遵循的不同設計策略。

順便說一句,我沒有看到在你的例子中在類級別需要private int a,b聲明。 實際上它甚至沒有被使用,因此這個bean是線程安全的。

1)如果您依賴Spring來管理bean,並且正如您所說的那樣使用默認的單例范圍,那么其他bean將使用相同的實例。 但是,如果您自己實例化該類(例如使用new ),那么每次都會有一個新類的實例。

2)如果你有100個並發請求,那么將有100個線程,所有這些線程都可以同時調用你的類而不會阻塞。 也就是說,您可以使線程彼此等待(例如,通過使用synchronized或任何Lock類)。 當然,性能將受到影響,因為您現在有99個線程在等待的情況。 你更喜歡這種解決方案的唯一原因是你的bean有一個共享的,可變的狀態,這是我建議的。 沿着這些方向,您可以從示例中刪除實例變量ab 畢竟,無論如何都沒有使用它們,因為ab都是作為方法參數傳遞的:

public class SingleTonClass {

    public int sum(int a ,int b) {
        return a+b;
    }
}

暫無
暫無

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

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