国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

多線程計數,怎么保持計數準確的方法

2019-11-26 15:47:42
字體:
來源:轉載
供稿:網友

首先使用設計模式中的單件模式,防止多次初始化對象,造成訪問空間的不一致。

計數處要加lock,將其他線程計數暫時阻塞,保證計數的正確性。

如果要想實時計數實時輸出,可以將計數和輸出處一并lock處理,不然不同線程的計數和輸出結果未必按順序處理,

如此加鎖能保證按順序處理按順序輸出,不過這樣多少都 損失了一些性能

代碼中加鎖位置很重要

此程序會增加三次運算,原因是本線程未到200次,但是必然會有一個線程第一次增加所以在add里再做判斷

復制代碼 代碼如下:

CommonSigleton MyCounter =CommonSigleton.Instance;
  /// <summary>
  /// 線程工作
  /// </summary>
public void DoSomeWork()
{
    ///構造顯示字符串
    string results = "";

    ///創建一個Sigleton實例

    System.Threading.Thread.Sleep(100);

    int i = 0;
    while (MyCounter.GetCounter() < 200)
    {
        //保證計數與輸出一致,即便計數與輸出之間加上時間間隔也會為這塊區域加鎖,防止其他線程操作
        lock (this)
        {
            ///開始計數
            MyCounter.Add();
            System.Threading.Thread.Sleep(100);
            Thread thread = Thread.CurrentThread;
            results += "線程";
            results += i++.ToString() + "――〉" + thread.Name + " ";
            results += "當前的計數:";
            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也只執行和其他線程相同的工作
   DoSomeWork();
  }
 }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 萝北县| 高要市| 会泽县| 竹山县| 肃宁县| 平原县| 南陵县| 寻乌县| 大厂| 扶余县| 雷山县| 佛坪县| 墨竹工卡县| 黎平县| 福安市| 抚州市| 岳阳市| 宁南县| 通城县| 宜春市| 始兴县| 通渭县| 扬中市| 渝中区| 泽库县| 乾安县| 敖汉旗| 正定县| 保康县| 青海省| 邵阳市| 师宗县| 海兴县| 滨海县| 宣城市| 开平市| 长泰县| 涿鹿县| 镶黄旗| 大城县| 湖口县|