多线程计数,怎么保持计数准确的方法

首先使用设计模式中的单件模式,防止多次初始化对象,造成访问空间的不一致。

计数处要加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();
  }
 }

(0)

相关推荐

  • Vue监听事件实现计数点击依次增加的方法

    1.实现计数器功能,每点击一次按钮,count值增加一或增加二,鼠标在cordinates行移动时会更新当前坐标,通过自定义函数或者stop属性禁止事件传播. 效果如下: 代码如下: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>计数器自增函数</title> <script src="vue.js"></s

  • 详解Java多线程编程中CountDownLatch阻塞线程的方法

    直译过来就是倒计数(CountDown)门闩(Latch).倒计数不用说,门闩的意思顾名思义就是阻止前进.在这里就是指 CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程. CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. CountDownLatch 的作用和 Thread.join() 方法类似,可用于一组线程和另外一组线程的协作.例如,主线程在做一项工作之前需要一系列的准备工作,只有这些准备工

  • Java多线程之死锁的出现和解决方法

    什么是死锁? 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不能正常运行.形象的说就是:一个宝藏需要两把钥匙来打开,同时间正好来了两个人,他们一人一把钥匙,但是双方都再等着对方能交出钥匙来打开宝藏,谁都没释放自己的那把钥匙.就这样这俩人一直僵持下去,直到开发人员发现这个局面. 导致死锁的根源在于不适当地运用"synchronized"关键词来管理线程对特定对象的访问."synchronized"关

  • Python多线程结合队列下载百度音乐的方法

    本文实例讲述了Python多线程结合队列下载百度音乐的方法.分享给大家供大家参考.具体如下: 一直想做个下载音乐的脚本,后来决定就拿百度音乐开刀,经过多次分析,终于制作了一个下载百度音乐的脚本,目前只默认下载第一页,童鞋们可以自由拓展. 适用Windows和Linux平台.依赖BeautifulSoup这个库,主要对HTML进行解析 #!/usr/bin/python # -*- coding: utf-8 -*- ''' 百度中批量下载某歌手的歌(目前只下载第一页,可以自行拓展) @autho

  • python 多线程对post请求服务器测试并发的方法

    如下所示: # -*- coding: utf-8 -*- import requests import threading import time class postrequests(): def __init__(self): self.url = '请求网址' self.files = { 'unknown_image':open('刘诗诗.jpg','rb') } def post(self): try: r = requests.post(self.url,files=self.fi

  • Python 多线程不加锁分块读取文件的方法

    多线程读取或写入,一般会涉及到同步的问题,否则产生的结果是无法预期的.那么在读取一个文件的时候,我们可以通过加锁,但读不像写操作,会导致文件错误,另外锁操作是有一定的耗时.因此通过文件分块,可以比较有效的解决多线程读问题,之前看到有人写的分块操作,比较复杂,需要实现建立好线程以及所读取块信息,在这里,我提供了一种比较简便的方法,以供参考. #!/user/bin/env python #_*_coding:utf-8_*_ from threading import Thread import

  • python多线程调用exit无法退出的解决方法

    python启用多线程后,调用exit出现无法退出的情况,原因是exit会抛出Systemexit的异常,如果在exit外围调用了try,就会出现ctrl+c两次才能退出的情况 解决方法: thread.setDaemon(True) thread.start() 线程启动前设置setDaemon(True) 以上这篇python多线程调用exit无法退出的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Java多线程之如何确定线程数的方法

    关于多线程的线程数的确定,最近研读过几篇paper,在此做一下笔记,方便使用时翻看. 1.<Java 虚拟机并发编程>中介绍 就是说:线程数 = CPU的核心数 * (1 - 阻塞系数) 另一篇:<Java Concurrency in Practice>即<java并发编程实践>,给出的线程池大小的估算公式: Nthreads=Ncpu*Ucpu*(1+w/c),其中 Ncpu=CPU核心数,Ucpu=cpu使用率,0~1:W/C=等待时间与计算时间的比率 仔细推敲两

  • Java让多线程按顺序执行的几种方法

    目录 在子线程中通过join()方法指定顺序 在主线程中通过join()方法指定顺序 通过倒数计时器CountDownLatch实现 通过创建单一化线程池newSingleThreadExecutor()实现 文章介绍4种方法,简单易懂,通过4个demo抛砖引玉. 在子线程中通过join()方法指定顺序 通过join()方法使当前线程“阻塞”,等待指定线程执行完毕后继续执行.举例:在线程thread2中,加上一句thread1.join(),其意义在于,当前线程2运行到此行代码时会进入阻塞状态,

  • JAVA多线程之中断机制及处理中断的方法

    目录 一,介绍 二,中断及如何响应中断? 一,介绍 这篇文章主要记录使用 interrupt() 方法中断线程,以及如何对InterruptedException进行处理.感觉对InterruptedException异常进行处理是一件谨慎且有技巧的活儿. 由于使用stop()方法停止线程非常的暴力,人家线程运行的好好的,突然就把人家杀死了,线程占用的锁被强制释放,极易导致数据的不一致性.可参考这篇文章对stop()方法的介绍. 因此,提出了一种温和的方式:请求另外一个线程不要再执行了,这就是中

随机推荐