在弄电商类网站的时候,往往是根据年月日时分秒的格式生成订单号(yyyyMMddHHmmss),为了解决并发性,就直接在生成订单号的区域块加上lock。
下面,我们来简单测试一下。
1.新建项目(控制台应用程序)
2.新建一个类:OrderIdHelper.cs
- /// <summary>
- /// 订单助手
- /// </summary>
- class OrderIdHelper
- {
- private static readonly object Locker = new object();
- private static string _tempId = "";
- /// <summary>
- /// 生成订单编号
- /// </summary>
- public static void GenerateId()
- {
- lock (Locker) //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。
- {
- var orderId = "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss"); //年月日时分秒
- if (string.Equals(_tempId, orderId))
- {
- throw new Exception("订单号重复!");
- }
- _tempId = orderId;
- Console.WriteLine(orderId);
- }
- }
- }
3.Program.cs
- class Program
- {
- static void Main(string[] args)
- {
- //创建包含两个线程的数组
- var threads = new Thread[2]
- {
- new Thread(OrderIdHelper.GenerateId),
- new Thread(OrderIdHelper.GenerateId),
- };
- foreach (var thread in threads)
- {
- //线程启动
- thread.Start();
- }
- Console.Read();
- }
- }
4.结果:=====OrderIdDemo_1.rar 点我下载=====
5.发现一个不错的订单号生成规则,稍作改动: 不重复订单号生成规则(原网址)
- /// <summary>
- /// 订单助手
- /// </summary>
- public class OrderHelper
- {
- /// <summary>
- /// 防止创建类的实例
- /// </summary>
- private OrderHelper() { }
- private static readonly object Locker = new object();
- private static int _sn = 0;
- /// <summary>
- /// 生成订单编号
- /// </summary>
- /// <returns></returns>
- public static string GenerateId()
- {
- lock (Locker) //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。
- {
- if (_sn == int.MaxValue)
- {
- _sn = 0;
- }
- else
- {
- _sn++;
- }
- Thread.Sleep(100);
- return "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss")+ _sn.ToString().PadLeft(10, '0');
- }
- }
- }
6.关于使用GUID的个人见解。
①不清楚生成的时间,不方便管理。
②官方解释:GUID 是一个 128 位整数(16 字节),可用于所有需要唯一标识符的计算机和网络。 此标识符重复的可能性非常小。
以上所述就是本文的全部内容了,希望大家能够喜欢。
新闻热点
疑难解答