zoukankan      html  css  js  c++  java
  • 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如果不小心,就会产生莫名其妙的错误。
  • 相关阅读:
    【BZOJ 3090】 树形DP
    【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)
    【BZOJ 1019】 1019: [SHOI2008]汉诺塔 (DP?)
    【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
    【BZOJ 3566】 3566: [SHOI2014]概率充电器 (概率树形DP)
    【BZOJ 2121】 (字符串DP,区间DP)
    【BZOJ 4305】 4305: 数列的GCD (数论)
    【UOJ 179】 #179. 线性规划 (单纯形法)
    【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)
    【BZOJ 4027】 4027: [HEOI2015]兔子与樱花 (贪心)
  • 原文地址:https://www.cnblogs.com/juqiang/p/941665.html
Copyright © 2011-2022 走看看