static的不恰当应用

最近总是和static闹别扭,看下面这个例子(取自我客户的一个例子)
using System;
using System.Threading;

namespace StaticTest
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            (
new Thread(new ThreadStart(Database.RunProcedure))).Start();
            (
new Thread(new ThreadStart(Database.RunProcedure2))).Start();
        }

    }

    
public class Database
    
{
        
private static int conn = 0;

        
private static void Open()
        
{
            conn 
= 1;
        }


        
private static void Close()
        
{
            conn 
= 2;
        }


        
public static void RunProcedure()
        
{
            
while (true)
            
{
                Open();
                Console.WriteLine(
"Proc1 Open:" + conn);
                Close();
                Console.WriteLine(
"Proc1 Close:" + conn);
            }

        }


        
public static void RunProcedure2()
        
{
            
while (true)
            
{
                Open();
                Console.WriteLine(
"Proc2 Open:" + conn);
                Close();
                Console.WriteLine(
"Proc2 Close:" + conn);
            }

        }


    }

}


在命令行下面跑这个程序,假如叫做test.exe,那么你用test.exe>1.txt,等10-20秒,用一个好用的editor打开1.txt,查找Close:1或者Open:2。大部分时候很幸运,能找到这个本不应该出现的字符串,为什么?
设想conn是IDBConnection, comm是IDBCommand,那么你也许会想起来,在偶然的情况下,客户那里的代码
1. 数据库链接明明是Open的,但是偶然的情况下,会提示已经Close
2. 相同sp,不同的参数,偶然的情况下,会让客户的数据乱掉。如制单人明明是张三,偶尔的情况下会变成李四。

这个代码不难,按照singleton模式,加一个lock,两层的null判断就可以了。但是针对这个database,我的经验更倾向于使用instance,而不是static。static如果不小心,就会产生莫名其妙的错误。
posted @   鞠强  阅读(2468)  评论(20编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

hello

world

点击右上角即可分享
微信分享提示