簡體   English   中英

多線程環境中的靜態方法與單例方法

[英]static method vs singleton methods in multithreaded environment

我有一個帶有靜態方法和單例類的代碼示例

//code with static methods
public class DataManager{
  public static Object getDataObject(){
     HashMap map = new HashMap();
     //Some processing in collections
     //retrieval of data
  }
  public static void writeData(Object o){
     HashMap map = new HashMap();
     //Some processing in collections
     //writing data
  }
}
//code with singleton
public class DataManager{
   private static DataManager instance;
   private DataManager(){
   }
   public static DataManager getInstance(){
     if(instance == null){
        synchronized(DataManager.class){
          if(instance == null){
              instance = new DataManager();
          }
       }
    }
    return instance;
  }
  public Object getDataObject(){
     HashMap map = new HashMap();
     //Some processing in collections
     //retrieval of data
  }
  public writeData(Object o){
     HashMap map = new HashMap();
     //Some processing in collections
     //writing data
  }
}

這是最好的使用方式。 當兩個線程調用的我的方法之一,會怎樣? 在對集合進行處理時,我的數據是否有可能被破壞? 靜態方法已為其分配了公共內存,因此當2個線程調用一個靜態方法時,它們會相互影響嗎? 在單例中,僅創建一個實例,如果2個線程使用一個實例調用一個方法,會互相影響嗎? 請幫助理解這一點。 謝謝...

從不同的線程調用靜態方法不會破壞任何內容...除非方法正在使用/更改共享實例或靜態變量,但在那種情況下,它適用於所有方法,而不僅僅是具有靜態性質的方法。
這不是第一次有人對此感到困惑...請在Google上搜索或在Stackoverflow中搜索類似的問題。 這個問題被多次回答。

使用靜態方法還是單例都不會影響線程安全。 您的代碼可能是線程安全的,也可能不是線程安全的,具體取決於您執行的處理類型。 (如所示,您的代碼是線程安全的,因為映射是在getDataObjectwriteData方法的本地創建的,因此不會在不同線程之間共享。)

通常,如果不同的線程不能同時訪問相同的數據,則代碼是線程安全的。 同樣,如果對象是只讀的,則多個線程可以同時讀取該對象,而不會破壞線程的安全性。 一旦一個線程修改了共享數據,您就必須同步對其的訪問。

根據我對多線程的理解,共享對象將由多個線程訪問。

因此,在您的兩個程序中,映射對象都是共享實例,將由多個線程訪問。 因此,您應該同步映射對象以確保線程安全。

Singleton或Static與此無關

暫無
暫無

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

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