zoukankan      html  css  js  c++  java
  • 基础才是重中之重~你是否真正理解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     }

    建议使用线程安全的单件,通过测试,没有问题。

    回到目录

  • 相关阅读:
    通过坐标比较来取代hitTest()
    用于判断数组是否完全包含另外的一个数组的所有元素
    flash中trace可显示正确的元件名称,可是程序无法控制该mc
    拿人多少薪水,就要承担多少的责任和压力
    影片剪辑的位置几种方法
    lite:最多支持12个键 ...
    为离我们远去的同胞默哀
    卡巴斯基6累积离线升级包的制作方法
    简单面试
    C#常用函数
  • 原文地址:https://www.cnblogs.com/lori/p/2304588.html
Copyright © 2011-2022 走看看