在实际应用过程中很多情况下涉及大批量、频繁访问,这样就会存在并发操作,如何保证数据的唯一正确性就成了一个问题,以下将自己为别人做的一个示例展示给大家,什么不足的地方大家也提提意见!
应用场景:
售票系统,假如涉及到以下几种简单数据访问操作: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 }
应用场景:
售票系统,假如涉及到以下几种简单数据访问操作: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 }
本文展示了在高并发的售票系统场景下,如何通过单例模式和锁机制确保数据访问的一致性和准确性,避免多线程并发操作导致的数据错误。
3488

被折叠的 条评论
为什么被折叠?



