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

 更新时间:2014年01月10日 15:35:41   作者:  
这篇文章主要介绍了多线程计数的方法,有需要的朋友可以参考一下

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

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

相关文章

  • executor包执行器功能

    executor包执行器功能

    这篇文章主要介绍了executor包执行器功能,executor包中的各个子包提供的功能,最终这些功能都由Executor接口及其实现类共同对外提供服务。下文介绍该执行功能,具有一定的参考价值,需要的朋友可以考一下
    2022-02-02
  • 深入理解Java设计模式之适配器模式

    深入理解Java设计模式之适配器模式

    这篇文章主要介绍了JAVA设计模式之适配器模式的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解
    2021-11-11
  • maven安装、使用、配置本地仓库、idea配置maven以及解决plugins报错问题

    maven安装、使用、配置本地仓库、idea配置maven以及解决plugins报错问题

    本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目时首先会从本地仓库查找资源,如果没有那么Maven会从远程仓库下载到你本地仓库,这篇文章主要给大家介绍了关于maven安装、使用、配置本地仓库、idea配置maven以及解决plugins报错问题的相关资料,需要的朋友可以参考下
    2024-01-01
  • SpringBoot整合RabbitMQ消息队列的完整步骤

    SpringBoot整合RabbitMQ消息队列的完整步骤

    这篇文章主要给大家介绍了关于SpringBoot整合RabbitMQ消息队列的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Java实现简单画画画板

    Java实现简单画画画板

    这篇文章主要为大家详细介绍了Java实现简单画画画板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Spring基础篇之初识DI和AOP

    Spring基础篇之初识DI和AOP

    这篇文章主要为大家详细介绍了Spring基础篇之初识DI和AOP,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • SSM Mapper文件查询出返回数据查不到个别字段的问题

    SSM Mapper文件查询出返回数据查不到个别字段的问题

    这篇文章主要介绍了SSM Mapper文件查询出返回数据查不到个别字段的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • springboot:接收date类型的参数方式

    springboot:接收date类型的参数方式

    这篇文章主要介绍了springboot:接收date类型的参数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Spring Mybatis Mapper模糊查询的几种方法

    Spring Mybatis Mapper模糊查询的几种方法

    在Spring结合Mybatis进行开发时,实现模糊查询是一个常见需求,在Mybatis中,LIKE查询可以通过多种方式实现,本文给大家介绍了Spring Mybatis Mapper模糊查询的几种方法,需要的朋友可以参考下
    2024-03-03
  • SpringMVC异常处理知识点总结

    SpringMVC异常处理知识点总结

    在本篇文章里小编给大家整理的是关于SpringMVC异常处理相关知识点内容,需要的朋友们学习下。
    2019-10-10

最新评论