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文档==>

  • 相关阅读:
    exciting和excited的具体用法怎么区分
    有理数的简算
    is和do的区别
    五则运算计算规则
    家庭小账本
    等差数列和等比数列(快速求存储年份)
    python argparse命令行参数
    Linux Anaconda安装步骤
    Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库
    tornado调用ioloop TracebackFuture实现非堵塞的模块
  • 原文地址:https://www.cnblogs.com/liqingwen/p/4573833.html
Copyright © 2011-2022 走看看