多線程計(jì)數(shù),怎么保持計(jì)數(shù)準(zhǔn)確的方法
首先使用設(shè)計(jì)模式中的單件模式,防止多次初始化對(duì)象,造成訪問(wèn)空間的不一致。
計(jì)數(shù)處要加lock,將其他線程計(jì)數(shù)暫時(shí)阻塞,保證計(jì)數(shù)的正確性。
如果要想實(shí)時(shí)計(jì)數(shù)實(shí)時(shí)輸出,可以將計(jì)數(shù)和輸出處一并lock處理,不然不同線程的計(jì)數(shù)和輸出結(jié)果未必按順序處理,
如此加鎖能保證按順序處理按順序輸出,不過(guò)這樣多少都 損失了一些性能
代碼中加鎖位置很重要
此程序會(huì)增加三次運(yùn)算,原因是本線程未到200次,但是必然會(huì)有一個(gè)線程第一次增加所以在add里再做判斷
CommonSigleton MyCounter =CommonSigleton.Instance;
/// <summary>
/// 線程工作
/// </summary>
public void DoSomeWork()
{
///構(gòu)造顯示字符串
string results = "";
///創(chuàng)建一個(gè)Sigleton實(shí)例
System.Threading.Thread.Sleep(100);
int i = 0;
while (MyCounter.GetCounter() < 200)
{
//保證計(jì)數(shù)與輸出一致,即便計(jì)數(shù)與輸出之間加上時(shí)間間隔也會(huì)為這塊區(qū)域加鎖,防止其他線程操作
lock (this)
{
///開(kāi)始計(jì)數(shù)
MyCounter.Add();
System.Threading.Thread.Sleep(100);
Thread thread = Thread.CurrentThread;
results += "線程";
results += i++.ToString() + "——〉" + thread.Name + " ";
results += "當(dāng)前的計(jì)數(shù):";
results += MyCounter.GetCounter().ToString();
results += "\n";
Console.WriteLine(results);
// 清空顯示字符串
results = "";
}
}
}
public void StartMain()
{
Thread thread0 = Thread.CurrentThread;
thread0.Name = "Thread 0";
Thread thread1 =new Thread(new ThreadStart(DoSomeWork));
thread1.Name = "Thread 1";
Thread thread2 =new Thread(new ThreadStart(DoSomeWork));
thread2.Name = "Thread 2";
Thread thread3 =new Thread(new ThreadStart(DoSomeWork));
thread3.Name = "Thread 3";
thread1.Start();
thread2.Start();
thread3.Start();
///線程0也只執(zhí)行和其他線程相同的工作
DoSomeWork();
}
}
相關(guān)文章
maven安裝、使用、配置本地倉(cāng)庫(kù)、idea配置maven以及解決plugins報(bào)錯(cuò)問(wèn)題
本地倉(cāng)庫(kù)是遠(yuǎn)程倉(cāng)庫(kù)的一個(gè)緩沖和子集,當(dāng)你構(gòu)建Maven項(xiàng)目時(shí)首先會(huì)從本地倉(cāng)庫(kù)查找資源,如果沒(méi)有那么Maven會(huì)從遠(yuǎn)程倉(cāng)庫(kù)下載到你本地倉(cāng)庫(kù),這篇文章主要給大家介紹了關(guān)于maven安裝、使用、配置本地倉(cāng)庫(kù)、idea配置maven以及解決plugins報(bào)錯(cuò)問(wèn)題的相關(guān)資料,需要的朋友可以參考下2024-01-01SpringBoot整合RabbitMQ消息隊(duì)列的完整步驟
這篇文章主要給大家介紹了關(guān)于SpringBoot整合RabbitMQ消息隊(duì)列的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Java實(shí)現(xiàn)簡(jiǎn)單畫(huà)畫(huà)畫(huà)板
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單畫(huà)畫(huà)畫(huà)板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06SSM?Mapper文件查詢(xún)出返回?cái)?shù)據(jù)查不到個(gè)別字段的問(wèn)題
這篇文章主要介紹了SSM?Mapper文件查詢(xún)出返回?cái)?shù)據(jù)查不到個(gè)別字段的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01springboot:接收date類(lèi)型的參數(shù)方式
這篇文章主要介紹了springboot:接收date類(lèi)型的參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Spring Mybatis Mapper模糊查詢(xún)的幾種方法
在Spring結(jié)合Mybatis進(jìn)行開(kāi)發(fā)時(shí),實(shí)現(xiàn)模糊查詢(xún)是一個(gè)常見(jiàn)需求,在Mybatis中,LIKE查詢(xún)可以通過(guò)多種方式實(shí)現(xiàn),本文給大家介紹了Spring Mybatis Mapper模糊查詢(xún)的幾種方法,需要的朋友可以參考下2024-03-03SpringMVC異常處理知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是關(guān)于SpringMVC異常處理相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-10-10