概述在弄电商类网站的时候,往往是根据年月日时分秒的格式
生成订单号(yyyyMMddHHmmss),为了解决并发性,就直接在生成订单号的区域块加上lock。下面,我们来简单测试一下。1.新建项目(控制台应用程序) 2.新建一个类:OrderIdHelper.cs1 /// <summary>2 /// 订单助手3 /// </summary>4 class OrderIdHelper5 {6 private static readonly object Locker = new object();7 private static string _tempId = "";89 /// <summary>10 /// 生成订单编号11 /// </summary>12 public static void GenerateId()13 {14 lock (Locker) //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。15 {16 var orderId = "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss"); //年月日时分秒1718 if (string.Equals(_tempId, orderId))19 {20 throw new Exception("订单号重复!");21 }2223 _tempId = orderId;2425 Console.WriteLine(orderId);26 }27 }28 }View Code 3.Program.cs1 class Program2 {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 };1112 foreach (var thread in threads)13 {14 //线程启动15 thread.Start();16 }1718 Console.Read();19 }20 }View Code 4.结果:=====OrderIdDemo_1.rar 点我下载=====5.发现一个不错的订单号生成规则,稍作改动: 不重复订单号生成规则(原网址)1 /// <summary>2 /// 订单助手3 /// </summary>4 public class OrderHelper5 {6 /// <summary>7 /// 防止创建类的实例8 /// </summary>9 private OrderHelper() { }1011 private static readonly object Locker = new object();12 private static int _sn = 0;1314 /// <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 else27 {28 _sn++;29 }3031 Thread.Sleep(100);3233 return "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss")+ _sn.ToString().PadLeft(10, '0');34 }35 }36 } 6.关于使用GUID的个人见解。①不清楚生成的时间,不方便管理。②官方解释:GUID 是一个 128 位整数(16 字节),可用于所有需要唯一标识符的计算机和网络。 此标识符重复的可能性非常小。<==详见MSDN文档==>
在弄电商类网站的时候,往往是根据年月日时分秒的格式生成订单号(yyyyMMddHHmmss),为了解决并发性,就直接在生成订单号的区域块加上lock。
下面,我们来简单测试一下。
1.新建项目(控制台应用程序)
2.新建一个类:OrderIDHelper.cs
Locker = _tempID = (Locker) orderID = + DateTime.Now.ToString(); ( Exception( _tempID = }3.Program.cs
Main( threads = Thread[ ( thread }4.结果:==========
5.发现一个不错的订单号生成规则,稍作改动: (原网址)
Locker = _sn = (Locker) (_sn == _sn = _sn++ Thread.Sleep( + DateTime.Now.ToString()+ _sn.ToString().Padleft(, } 6.关于使用GUID的个人见解。
①不清楚生成的时间,不方便管理。
②官方解释:。
总结 以上是内存溢出为你收集整理的C#:lock锁与订单号(或交易号)的生成全部内容,希望文章能够帮你解决C#:lock锁与订单号(或交易号)的生成所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
评论列表(0条)