.NET 多线程同步 / 并发操作数据唯一

本文展示了在高并发的售票系统场景下,如何通过单例模式和锁机制确保数据访问的一致性和准确性,避免多线程并发操作导致的数据错误。
在实际应用过程中很多情况下涉及大批量、频繁访问,这样就会存在并发操作,如何保证数据的唯一正确性就成了一个问题,以下将自己为别人做的一个示例展示给大家,什么不足的地方大家也提提意见!
  应用场景:
  售票系统,假如涉及到以下几种简单数据访问操作:1.余票查询;2.购票;3:临时增加售票/退票 ,如果访问量较大,很多个用户同时访问时。
  如1和2同时操作,2和3同时操作,1和3同时操作,就可能导致获取的数据信息不准确,这里我们就需要的效果就是当任何一个用户在进行如上的1或2或3操作时,其它用户都处于等待状态,只有前一个用户执行完后,其它用户方可进行。
  不废话了,直接上代码:
  1.处理类 TicketFactory(增/删/查)
  此处理类即可保证查询余票、购票、退票 时,数据的唯一准确性
 1 /**************************************** 模块头 *****************************************\
 2 * 模块名:TicketFactory.cs
 3 * 项目名:MultiThreadSync
 4 * 版权 (c) markeluo
 5 *
 6 * 本项目演示了在多线程并发对同一个对象进行操作,如何保证对象的唯一性
 7 *
 8 \*****************************************************************************************/
 9  .NET教程
10 using System;
11 using System.Collections.Generic;
12 using System.Linq;
13 using System.Text;
14  
15 namespace MultiThreadSync
16 {
17 /// <summary>
18 /// 余票处理类(查询余票、购票、退票)
19 /// </summary>
20 public class TicketFactory
21 {
22 private static TicketFactory ticketmanager = new TicketFactory();
23 /// <summary>
24 /// 锁定对象
25 /// </summary>
26 private static object _sysobj = new object();
27 /// <summary>
28 /// 余票处理 实例 单例
29 /// </summary>
30 public static TicketFactory Instanc
31 {
32 get
33 {
34 return ticketmanager;
35 }
36 }
37  
38 /// <summary>
39 /// 余票总数量 (假设此数据是从数据库中获取的)
40 /// </summary>
41 private int TicketCount = 10000;
42  
43 /// <summary>
44 /// 查询余票
45 /// </summary>
46 /// <returns></returns>
47 public int GetTickets()
48 {
49 lock (_sysobj)
50 {
51 //暂停1秒以测试效果
52 System.Threading.Thread.Sleep(1000);
53  
54 return TicketCount;
55 //实际应该从数据库中获取
56 }
57 }
58  
59 /// <summary>
60 /// 退票/增加票数
61 /// </summary>
62 /// <returns></returns>
63 public void AddTickets(int Count)
64 {
65 lock (_sysobj)
66 {
67 //暂停2秒以测试效果
68 System.Threading.Thread.Sleep(2000);
69  
70 TicketCount += Count;
71 //实际应该添加到数据库
72 }
73 }
74  
75 /// <summary>
76 /// 购票
77 /// </summary>
78 /// <param name="Count"></param>
79 public void BuyTickets(int Count)
80 {
81 lock (_sysobj)
82 {
83 //暂停3秒以测试效果
84 System.Threading.Thread.Sleep(3000);
85  
86 TicketCount -= Count;
87 //实际应该从数据库中移除相应的专利数量
88 }
89 }
90  
91 }
92 }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值