解析static的不恰当应用
来源:互联网 发布:网络上么么扎 什么意思 编辑:程序博客网 时间:2024/05/21 06:13
来源:基于.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如果不小心,就会产生莫名其妙的错误。
- 解析static的不恰当应用
- 不恰当的提示还不如不提示
- 防止到 String 类的不恰当的类型转换
- 即时通讯软件调用接口的方法不恰当的问题
- 谁在创建session(1)-不恰当的request.getSession()
- 谁在创建session(1)-不恰当的request.getSession()
- 建议73:避免锁定不恰当的同步对象
- .Net下的线程同步:Part 6 of N--(避免锁定不恰当的同步对象)
- 改善C#程序的建议8:避免锁定不恰当的同步对象
- 改善C#程序的建议8:避免锁定不恰当的同步对象
- 针对第三方SDK中不恰当的char *类型的几点看法
- 不恰当使用线程池处理 MQ 消息引起的故障
- 建议59:不要在不恰当的场合下引发异常
- 不恰当的update语句使用主键和索引导致mysql死锁
- 不恰当使用线程池处理 MQ 消息引起的故障
- 不恰当的update语句使用主键和索引导致mysql死锁
- 不恰当使用线程池处理 MQ 消息引起的故障
- static的作用解析
- Linux那些事儿之我是UHCI(12)一个函数引发的故事(三)
- ArcIMS9.2安装手册
- [英语阅读]万圣节调查:你相信鬼吗?
- 程序员怎样学数学:半路出家也能让编程是小菜一碟
- jsp+javascript制作验证码
- 解析static的不恰当应用
- adobe flash player installer 无法验证安装程序
- INNER JOIN和left JOIN
- MapX MapInfo truetype 字体编号对照。
- 把字符串赋值给字符数组
- 卸载 Visual Studio 2005步骤
- C++常类型(const)
- Map、Collection、List接口的总结
- 我的ASP. net之旅