基礎才是重中之重~你是否真正理解static對象


回到目錄

我們掛在嘴過的一句話就是“static是靜態對象,在類第一次被使用,或者第一次被實例化時執行“,但是你是否真正理解這句話,或者說

你是否有對這句話進行一個實際的驗證,如果沒有,那我來帶您完成這次旅行吧!

首先有一張表,不會經常發生變化,比如分類表,他是一種樹型結構表,結構可能是這樣

  

 1  /// <summary>
 2     /// 分類表       
 3     /// </summary>
 4     public partial class Common_Category : IDataEntity
 5     {
 6         //初始字段
 7         #region original field
 8 
 9         /// <summary>
10         /// ID
11         /// </summary>
12         public Int32 ID { get; set; }
13 
14         /// <summary>
15         /// 上級ID
16         /// </summary>
17         public Int32 ParentID { get; set; }
18  
19 
20         /// <summary>
21         /// 名稱
22         /// </summary>
23         public String Name { get; set; }

 

首先,它在程序中會經常被調用,也就是說,會經常訪問這張數據表,由於它的內容基本不變,所以,我想到了static對象,下面我用static對象來完成這個需求

  

 1   /// <summary>
 2         /// 得到靜態對象(一般表數據不發生變)
 3         /// </summary>
 4         /// <returns></returns>
 5         public static IList<Common_Category> GetCommon_CategoryModel
 6         {
 7             get
 8             {
 9                 return new LinqDBDataContext().Common_Category.ToList();
10             }
11         }

 

這樣,可以完成我們的需求,這種設計在單機調試時沒有任何問題,但發布后,在IIS里訪問時,它的對象雖然創建了一次,但沒是刷新一次

就連接一次數據庫,沒有解決我們的問題,之后,有了新的想法:

單件,對單件模式,每個對象有且只有一個實例出現,有兩個方式的單件,線程安全的和不安全的,呵呵,都拿出來看看:

 

 1 /// <summary>
 2     /// 線程安全的單件模式
 3     /// </summary>
 4     public sealed class StaticCustomer
 5     {
 6         private static volatile IList<Customer> instance = null;
 7         // Lock對象,線程安全所用
 8         private static object syncRoot = new Object();
 9 
10         private StaticCustomer() { }
11 
12         public static IList<Customer> Instance
13         {
14             get
15             {
16                 if (instance == null)
17                 {
18                     lock (syncRoot)
19                     {
20                         if (instance == null)
21                             instance = new LinqDBDataContext().Customer.ToList();
22                     }
23                 }
24 
25                 return instance;
26             }
27         }
28     }
29 
30     /// <summary>
31     /// 簡單的模式,沒有考慮線程問題
32     /// </summary>
33     public sealed class SingtonCustomer
34     {
35         private static IList<Customer> instance = null;
36         private SingtonCustomer() { }
37         public static IList<Customer> Instance
38         {
39             get
40             {
41                 if (instance == null)
42                 {
43                     instance = new LinqDBDataContext().Customer.ToList();
44                 }
45                 return instance;
46             }
47         }
48     }

 

建議使用線程安全的單件,通過測試,沒有問題。

回到目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM