首页 > 编程语言 >C#-关于多线程下锁的使用,提高共享资源利用率的问题思考

C#-关于多线程下锁的使用,提高共享资源利用率的问题思考

时间:2024-03-07 15:13:39浏览次数:34  
标签:count 下锁 void Locker 共享资源 计数器 new 多线程 public

前一段时间阅读某公司项目的代码,发现类的单例模式无处不在,为了控制单例全局对象属性跨线程访问到处加锁,由于每个研发人员技术及业务水平参差不齐,锁的控制范围可能会扩大化,真正需要锁住的变量利用率降低。

举例:

全局变量 int Count = 0;

定义锁对象 object CountLocker = new Object();

function1()

{

  lock(CountLocker)

  {

    Count++;

    //其他一些耗时逻辑

  }

}

这种情况下,控制计数器的锁在没有完成其他一些耗时逻辑的时候就无法得到释放,使用Count计数器的线程就一直在等待,这种靠人为因素扩大了锁的作用范围可以通过封装计数器读写自锁类型实现,只在访问计数器的时候锁住计数器

  class Program
    {
        public static Locker<int> count = new Locker<int>(0);

        static void Main(string[] args)
        {
            var watch = new Stopwatch();
            watch.Start();
            var tasks = new List<Task>();
            for (int i = 0; i < 10; i++)
            {
                var task = new Task(Add);
                tasks.Add(task);
                task.Start();
            }

            Task.WaitAll(tasks.ToArray());
            watch.Stop();
            Console.WriteLine(count.Get() + ":" + watch.ElapsedMilliseconds);

            Console.Read();
        }

        private static void Add()
        {
            for (int i = 0; i < 10000000; i++)
            {
                count.Set((ref int count) => //已经完成了对计数器的锁处理
                {
                    count++;
                });

          //其他一些耗时逻辑
} } }    public delegate void LockerSetter<T>(ref T currentValue);

  //读写互斥锁类 public sealed class Locker<T> { private readonly object locker = new object(); private T data; private Locker() { } public Locker(T rawData = default(T)) : this() { this.data = rawData; } public void Set(LockerSetter<T> setter) { lock (locker) { setter(ref data); } } public T Get() { lock (locker) { return data; } } public T Value { get { return Get(); } } }

  

标签:count,下锁,void,Locker,共享资源,计数器,new,多线程,public
From: https://www.cnblogs.com/sunyankun/p/18058931

相关文章

  • 多线程系列(十五) -常用并发工具类详解
    一、摘要在前几篇文章中,我们讲到了线程、线程池、BlockingQueue等核心组件,其实JDK给开发者还提供了比synchronized更加高级的线程同步组件,比如CountDownLatch、CyclicBarrier、Semaphore、Exchanger等并发工具类。下面我们一起来了解一下这些常用的并发工具类!二、常用并发......
  • C++ Qt开发:运用QThread多线程组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QThread组件实现多线程功能。多线程技术在程序开发中尤为常用,Qt框架中提供了QThread库来......
  • 多线程系列(十四) -一文带你搞懂线程池技术
    一、前言虽然Java对线程的创建、中断、等待、通知、销毁、同步等功能提供了很多的支持,但是从操作系统角度来说,频繁的创建线程和销毁线程,其实是需要大量的时间和资源的。例如,当有多个任务同时需要处理的时候,一个任务对应一个线程来执行,以此来提升任务的执行效率,模型图如下:如......
  • 关于Java并发多线程的一点思考
    写在开头在过去的2023年双11活动中,天猫的累计访问人次达到了8亿,京东超60个品牌销售破10亿,直播观看人数3.0亿人次,订单支付频率1分钟之内可达百万级峰值,这样的瞬间高并发活动,给服务端带来的冲击可想而知,就如同医院那么多医生,去看病挂号时,有时候都需要排队,对于很多时间就是金钱的场......
  • 多线程网络编程
    创建tcp套接字1//intsocket(intdomain,inttype,intprotocol);2//-功能:创建一个套接字3//-参数:4//-domain:协议族5//AF_INET:ipv46//AF_INET6:ip......
  • 多线程系列(十三) -一文带你搞懂阻塞队列
    一、摘要在之前的文章中,我们介绍了生产者和消费者模型的最基本实现思路,相信大家对它已经有一个初步的认识。在Java的并发包里面还有一个非常重要的接口:BlockingQueue。BlockingQueue是一个阻塞队列,更为准确的解释是:BlockingQueue是一个基于阻塞机制实现的线程安全的队列。通......
  • 多线程系列(十二) -生产者和消费者模型
    一、简介在Java多线程编程中,还有一个非常重要的设计模式,它就是:生产者和消费者模型。这种模型可以充分发挥cpu的多线程特性,通过一些平衡手段能有效的提升系统整体处理数据的速度,减轻系统负载,提高程序的效率和稳定性,同时实现模块之间的解耦。那什么是生产者和消费者模型呢?简......
  • 多线程系列(十一) -浅析并发读写锁StampedLock
    一、摘要在上一篇文章中,我们讲到了使用ReadWriteLock可以解决多线程同时读,但只有一个线程能写的问题。如果继续深入的分析ReadWriteLock,从锁的角度分析,会发现它有一个潜在的问题:如果有线程正在读数据,写线程准备修改数据的时候,需要等待读线程释放锁后才能获取写锁,简单的说就是,读......
  • python中的多线程及锁介绍
    线程CPU执行调度的最小单位。不能独立存在,依赖进程存在。一个进程至少有一个线程,叫做主线程,另外还有内核线程、用户线程。线程之间共享内存。线程之间的通信效率远高于进程间通信效率,线程之间切换代价也比进程小很多。适用场景Python的多线程适用于IO密集型任务。多任务可以......
  • 多线程限流工具类-Semaphore
    Semaphore介绍Semaphore(信号量)是JAVA多线程中的一个工具类,它可以通过指定参数来控制执行线程数量,一般用于限流访问某个资源时使用。Semaphore使用示例需求场景:用一个核心线程数为6,最大线程数为20的线程池执行任务,但是要求最多只能同时运行3个线程代码:publicclassdemo{......