zoukankan      html  css  js  c++  java
  • C#:lock锁与订单号(或交易号)的生成

      在弄电商类网站的时候,往往是根据年月日时分秒的格式生成订单号(yyyyMMddHHmmss),为了解决并发性,就直接在生成订单号的区域块加上lock。

      下面,我们来简单测试一下。

    1.新建项目(控制台应用程序)

    2.新建一个类:OrderIdHelper.cs

     1     /// <summary>
     2     /// 订单助手
     3     /// </summary>
     4     class OrderIdHelper
     5     {
     6         private static readonly object Locker = new object();
     7         private static string _tempId = "";
     8 
     9         /// <summary>
    10         /// 生成订单编号
    11         /// </summary>
    12         public static void GenerateId()
    13         {
    14             lock (Locker)   //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。
    15             {
    16                 var orderId = "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss");  //年月日时分秒
    17 
    18                 if (string.Equals(_tempId, orderId))
    19                 {
    20                     throw new Exception("订单号重复!");
    21                 }
    22 
    23                 _tempId = orderId;
    24 
    25                 Console.WriteLine(orderId);
    26             }
    27         }
    28     }
    View Code

    3.Program.cs

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             //创建包含两个线程的数组
     6             var threads = new Thread[2]
     7             {
     8                 new Thread(OrderIdHelper.GenerateId),
     9                 new Thread(OrderIdHelper.GenerateId),
    10             };
    11 
    12             foreach (var thread in threads)
    13             {
    14                 //线程启动
    15                 thread.Start();
    16             }
    17 
    18             Console.Read();
    19         }
    20     }
    View Code

    4.结果:=====OrderIdDemo_1.rar 点我下载=====

    5.发现一个不错的订单号生成规则,稍作改动: 不重复订单号生成规则(原网址)

     1     /// <summary>
     2     /// 订单助手
     3     /// </summary>
     4     public class OrderHelper
     5     {
     6         /// <summary>
     7         ///  防止创建类的实例
     8         /// </summary>
     9         private OrderHelper() { }
    10 
    11         private static readonly object Locker = new object();
    12         private static int _sn = 0;
    13 
    14         /// <summary>
    15         /// 生成订单编号
    16         /// </summary>
    17         /// <returns></returns>
    18         public static string GenerateId()
    19         {
    20             lock (Locker)   //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。
    21             {
    22                 if (_sn == int.MaxValue)
    23                 {
    24                     _sn = 0;
    25                 }
    26                 else
    27                 {
    28                     _sn++;
    29                 }
    30                 
    31                 Thread.Sleep(100);
    32 
    33                 return "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss")+ _sn.ToString().PadLeft(10, '0');
    34             }
    35         } 
    36     }

     6.关于使用GUID的个人见解。

      ①不清楚生成的时间,不方便管理。

      ②官方解释:GUID 是一个 128 位整数(16 字节),可用于所有需要唯一标识符的计算机和网络。 此标识符重复的可能性非常小<==详见MSDN文档==>

  • 相关阅读:
    nno_setup制作升级包必须面临的几个问题 2
    如何运用inno在安装和卸载时提示用户结束进程?
    inno安装卸载时检测程序是否正在运行卸载完成后自动打开网页-代码无效
    Inno Setup 插件大全
    INNO安装卸载自动结束进程插件使用
    Inno Setup 在安装程序开始前和卸载程序开始前,检查并关闭运行的进程
    INNO:检测程序是否已经安装,是则弹出卸载提示。
    Inno Setup 安装、卸载前检测进程或服务
    断点续传2
    解决 IDEA 创建 Gradle 项目没有src目录问题
  • 原文地址:https://www.cnblogs.com/liqingwen/p/4573833.html
Copyright © 2011-2022 走看看