C#线程安全的静态变量

生成唯一号:

/// <summary>
    /// 唯一码
    /// </summary>
    public class UniqueNumber
    {
        private static long num = 0;//流水号
        private static object lockObj = new object();
        /// <summary>
        /// 生成自增长码
        /// </summary>
        /// <returns></returns>
        static public long GenerateUniqueNumber()//应为private,暂时为public用来测试。
        {
            lock (lockObj)
            {
                num = num + 1;
                num = (num == 100000 ? 1 : num);
                num = long.Parse(num.ToString().PadLeft(5, ‘0‘));//五位(99999)
            }
            return num;
        }
        /// <summary>
        /// 获取唯一码
        /// </summary>
        /// <param name="SystemNo">系统号</param>
        /// <returns>唯一码</returns>
        static public long GetUniqueNumber(int SystemNo)
        {
            if (SystemNo > 99 && SystemNo < 1)
            {
                throw new Exception("系统号有误");
            }
            lock (lockObj)
            {
                //long utc = DateTime.Now.ToFileTimeUtc() - (new DateTime(2015, 1, 1)).ToFileTimeUtc();//15位有点长,
                string time =
                  DateTime.Now.Year.ToString().Substring(2) +
                  DateTime.Now.Month.ToString() +
                  DateTime.Now.Day.ToString() +
                  DateTime.Now.Hour.ToString() +
                  DateTime.Now.Minute.ToString() +
                  DateTime.Now.Second.ToString();//12位;
                return long.Parse(time + GenerateUniqueNumber().ToString() + SystemNo.ToString());//19位
            }
        }
    }

单元测试:

 /// <summary>
    /// 唯一码测试
    /// </summary>
    [TestClass]
    public class UniqueNumberTest
    {
        static List<long> list = new List<long>();

        /// <summary>
        /// 并发测试唯一码
        /// </summary>
        [TestMethod]
        public void GetUniqueNumberTest()
        {
            for (int i = 1; i < 99; i++)//N个线程
            {
                Thread thread = new Thread(new ParameterizedThreadStart(Execution));
                thread.Start(i);
            }
        }
        /// <summary>
        /// 错误事例:并发测试唯一码,有重复数
        /// </summary>
        [TestMethod]
        public void ERRORGetUniqueNumberTest()
        {
            for (int i = 1; i < 99; i++)//N个线程
            {
                Thread thread = new Thread(ERRORExecution);
                thread.Start();
            }
        }
        /// <summary>
        /// 根据系统号获取唯一码
        /// </summary>
        /// <param name="sysNo">系统号</param>
        public static void Execution(object sysNo)
        {
            for (int i = 0; i < 1000; i++)//M次循环执行
            {
                long v = UniqueNumber.GetUniqueNumber((int)sysNo);
                if (!list.Contains(v))//如果列表不包括就添加
                {
                    list.Add(v);
                }
                else
                {
                    Console.WriteLine("错误:" + v);//已经包括说明有重复值,就打印出来
                }
            }
        }
        public static void ERRORExecution()
        {
            for (int i = 0; i < 1000; i++)//M次循环执行
            {
                long v = UniqueNumber.GenerateUniqueNumber();
                if (!list.Contains(v))//如果列表不包括就添加
                {
                    list.Add(v);
                }
                else
                {
                    Console.WriteLine("错误:" + v);//已经包括说明有重复值,就打印出来
                }
            }
        }
    }
时间: 2024-10-07 02:37:39

C#线程安全的静态变量的相关文章

java线程安全问题之静态变量、实例变量、局部变量

Java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如:"一个类在可以被多个线程安全调用时就是线程安全的". 此处不赘述了,首先给出静态变量.实例变量.局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟! 静态变量:线程非安全. 静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态

(转)java线程安全问题之静态变量、实例变量、局部变量

java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”. 此处不赘述了,首先给出静态变量.实例变量.局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟! 静态变量:线程非安全. 静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象

VC和gcc在保证功能static对线程安全的差异变量

VC和gcc不同,不能保证静态变量的线程安全性.这就给我们的程序带来了非常大的安全隐患和诸多不便.这一点应该引起我们的重视!尤其是在构造函数耗时比較长的时候.非常可能给程序带来意想不到的结果.本文从測试代码開始,逐步分析原理,最后给出解决方式. 多线程状态下.VC不能保证在使用函数的静态变量的时候,它的构造函数已经被运行完成,以下是一段測试代码: class TestStatic { public: TestStatic() { Sleep(1000*10); m_num = 999; } pu

asp.net静态变量的生命周期和线程安全

void Application_Start开始 void Application_End结束的,本来这就是对的 今天要做一个全局的应用,想确认一下,在网上一找,我的天,说什么的都有 大概分三种 1.Application_Start——Application_End 2.Session_Start——Session_End 3.类生命周期结束 我用4个机器做了一个测试发现静态变量值一直是不变的,并没有因为其它用户登录而被销毁,确认应该是Application级的 静态类在首次访问时会调用静态构

线程中锁方法和静态变量的锁

1-----锁方法的使用: final ServletContext ctx = request.getServletContext();这个地方变量要定义成常量: new Thread(){//写成了内部类 public void run() { AddCount.add(ctx); }; }.start(); class AddCount{ //用类模板当锁 public synchronized static void add(ServletContext ctx){------- syn

4、 C++函数内的静态变量初始化以及线程安全问题

原文:https://www.cnblogs.com/zxjan/p/3538911.html 1. 如果是编译时和加载时初始化, 是不会存在线程安全这个issue的; 因为这两种初始化一定发生在Main函数执行之前, 这个时候尚未进入程序运行空间; 而这些初始化一定是在单线程环境下操作的!  --  都是在执行C Runtime的startup代码中的void mainCRTStartup(void)函数时所在的OS系统加载程序时的主线程空间上发生的! 2. 如果是运行时初始化, 因为无法保证

静态变量的加载问题

经常会有疑问,一个类的静态变量到底会在什么时候真正创建 今天实验了下,得出如下结论. 一个类的静态变量只会在该类被实例化,或者该类调用了静态变量.静态方法的时候创建.如果该类在其他类中只是定义变量,没有实际操作,静态变量也不会被实例化. 对于单例的饿汉模式,以前一直以为只要容器中有该类,就会创建单例对象,实际上是错误的.如果一个单例类仅仅有创建对象和操作该对象属性的操作,此时用饿汉模式非常好,因为它线程安全. 如果单例类有其他静态方法的操作,就有可能实例化了不想实例化的对象,造成该资源浪费. 此

c++ 类的静态变量

类的静态变量作为类的一部分,但不由类的创建产生,类的销毁而消失.静态变量和全局变量一样,会在main函数结束后销毁. 类可以对静态变量的值进行改变 #pragma once class ctest { public: ctest(void); ~ctest(void); static bool btest; }; 运用场景1: 类中有一个线程,但是类已经销毁了,而线程(while循环等)没有退出,这是可以通过静态变量来控制线程.

局部静态变量是如何做到只初始化一次的?

关于编译选项 -Wa,-adlhn参考 http://blog.csdn.net/lanxinju/article/details/5900986 以下内容来自于内网别的高人的回复 可以写个程序测试一下: class A { public: A() {} public: int a; }; int static_var_func() { static A a; return a.a++; } int main(int argc, char * argv[]) { static_var_func(