天天看點

C# 模拟并發

每次寫部落格,第一句話都是這樣的:程式員很苦逼,除了會寫程式,還得會寫部落格!

當然,題外話說多了,咱進入正題!

在處理大資料的時候,經常會發生并發,并發的情況發生後,會出現資料污讀,進而産生髒資料。

首先通過一段程式進行說明、<有興趣的小夥伴可以複制粘貼這段程式>。

項目背景:模拟大轉盤抽獎程式。

場下坐有近萬名群衆,他們在同一時刻同時抽獎,獎品分為一等獎:奔馳汽車10輛,二等獎:别克汽車20輛,三等獎:現代汽車30輛。(獎品資訊存入資料庫)

獎品資訊如下(資料庫部分):

create table JP_test

(

Id int identity(1,1),

JpLeave int,--獎品等級

JpName nvarchar(50),--獎品名稱

jpCount int,--獎品數量

)

insert into JP_test values(1,'奔馳汽車',10)

insert into JP_test values(2,'别克汽車',20)

insert into JP_test values(3,'現代汽車',30)

update JP_test set jpCount=10 where JpLeave=1

update JP_test set jpCount=20 where JpLeave=2

update JP_test set jpCount=30 where JpLeave=3

--以上SQL語句大家看懂表示沒壓力。在此不作講解。

程式思路:通過開辟線程進行模拟操作,一個線程代表一個群衆,由于群衆近萬人,我們暫且開辟十個線程并通過FOR循環進行模拟!

條件判斷:當資料庫中一等獎資料小于1時,不再進行一等獎的抽獎工作,也就是不再進行針對一等獎數量的減少工作。同理二等獎,三等獎。

最後輸出抽獎後的一等獎,二等獎,三等獎數量。

按照我們的設計思路,很顯然最後的答案應該為:一等獎,二等獎,三等獎數量都為0,真實情況是否如此?請看下面代碼。

模拟代碼如下:

T_SQL代碼如下:

下面我們看看程式執行的結果(因為近萬名群衆同時抽獎,同時與資料庫進行互動,是以程式運作會占用15秒左右的時間,請大家耐心等待):

C# 模拟并發

呵呵:最後一等獎,二等獎的數量都變成了負數(當然三等獎也可能為負數)!如果這個活動是公司年會抽獎,那麼你注定不好過年了!哈哈哈!

究其原因,就是咱們在操作資料庫的時候,沒有進行并發處理。有興趣的小虎伴們也可以嘗試: Thread td1 = new Thread(choujiang);進行操作!在此就不作示範了!

至此本篇部落格的任務就算完成了,模拟并發咱們也做到了!程式寫的比較簡單醜陋,歡迎大家積極改善發言!

繼續閱讀