基础才是重中之重~你是否真正理解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     }

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

本文转自博客园张占岭(仓储大叔)的博客,原文链接:基础才是重中之重~你是否真正理解static对象,如需转载请自行联系原博主。

目录
相关文章
|
4月前
|
C++
什么是单项式
单项式是代数式中的一种
|
人工智能 开发框架 .NET
.NET技术的强大功能:.NET技术的基础特性、在现代开发中的应用、以及它如何助力未来的软件开发。
.NET技术是软件开发领域的核心支柱,以其强大功能、灵活性及安全性广受认可。本文分三部分解析:基础特性如多语言支持、统一运行时环境;现代应用如企业级与Web开发、移动应用、云服务及游戏开发;以及未来趋势如性能优化、容器化、AI集成等,展望.NET在不断变化的技术环境中持续发展与创新。
485 4
|
9月前
|
自然语言处理 安全 开发工具
分享一个纯净无广、原版操作系统、开发人员工具、服务器等资源免费下载的网站
分享一个纯净无广、原版操作系统、开发人员工具、服务器等资源免费下载的网站
441 4
|
存储 Java 程序员
昵称重复怎么办?一招教你轻松搞定!
本文介绍了如何使用布隆过滤器高效管理用户昵称重复问题。在互联网项目中,确保昵称唯一性至关重要,可避免混淆、增强安全性和保持数据一致性。布隆过滤器通过哈希函数和位数组实现快速查询,具有低内存占用和高速查询的优点。文中详细解释了其工作原理,并提供了Java代码示例,帮助读者理解和应用这一技术,提升项目性能。
350 17
昵称重复怎么办?一招教你轻松搞定!
|
机器人 芯片
ChatGPT提问技巧——对话提示
ChatGPT提问技巧——对话提示
1213 8
|
机器学习/深度学习 数据采集 算法
图像处理神经网络数据预处理方法
图像预处理步骤对于图像处理神经网络至关重要。这些步骤不仅保证了数据的一致性和质量,还可以通过数据增强等技术提高模型的泛化能力,从而提升模型的整体性能。每一步骤的选择和应用都基于具体任务和数据集的特性,并在模型训练和测试过程中起到关键作用。
452 0
|
人工智能 数据挖掘 大数据
538个代码示例!麻省理工教授的Python程序设计+人工智能案例实践
Python简单易学,且提供了丰富的第三方库,可以用较少的代码完成较多的工作,使开发者能够专注于如何解决问题而只花较少的时间去考虑如何编程。 此外,Python还具有免费开源、跨平台、面向对象、胶水语言等优点,在系统编程、图形界面开发、科学计算、Web开发、数据分析、人工智能等方面有广泛应用。 尤其是在数据分析和人工智能方面,Python已成为最受开发者欢迎的编程语言之一,不仅大量计算机专业人员选择使用Python进行快速开发,许多非计算机专业人员也纷纷选择Python语言来解决专业问题。 由于Python应用广泛,关于Python的参考书目前已经有很多,但将Python编程与数据分析、人工智
|
存储 前端开发 Java
开题报告-基于SpringBoot的求职招聘系统的设计与实现
开题报告-基于SpringBoot的求职招聘系统的设计与实现
393 0
宜搭中,通过代码赋值后触发子表单的多行公式编辑
宜搭中,通过代码赋值后触发子表单的多行公式编辑
681 1
|
人工智能 算法 自动驾驶
播客分享 | ChatGPT之后,大模型的主战场在工业
播客分享 | ChatGPT之后,大模型的主战场在工业
387 0

热门文章

最新文章