zoukankan      html  css  js  c++  java
  • 解析static的不恰当应用

    来源:基于.NET的企业开发 - 博客园

    最近总是和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如果不小心,就会产生莫名其妙的错误。
  • 相关阅读:
    centos7没有ifconfig命令
    ubuntu建立快捷方式
    SIMTRACE环境搭建
    联想 Lenovo PWR-G60 无线掌中宝拆机
    初玩OpenWRT之编译TP-Link WR841N V8固件
    我有特殊的Windows激活姿势
    适用于WIFI Hacking的无线网卡推荐
    制作Wi-Fi Ducky远程HID攻击设备
    路由器固件安全分析技术(一)
    如何HACK无线家用警报器?
  • 原文地址:https://www.cnblogs.com/godwar/p/943474.html
Copyright © 2011-2022 走看看