不直接使用数据服务实例,而是将数据服务实例传给 DataService 实例。

在需要获取数据时,传递一个 Lambda 函数给DataService 实例去获取数据,这里就是DataService.GetData方法,在这个方法中对数据提供服务对象进行加锁,就可以实现多线程安全的访问同一个数据服务实例。

/// <summary>
/// 数据服务,防止多线程同时访问 IProductService 的数据库资源。
/// 这个实现并不完善。应该对DbContext加锁,而不是对一种数据服务实例(目前是IProductService实例)加锁。
/// </summary>
public class DataService
{private static object _lock = new object();private IProductService _product;public DataService(IProductService product){_product = product;}public T GetData<T>(Func<IProductService,T> func){lock (_lock){return func(_product);}}}

线程类

private IList<MonitorModel> _models = new List<MonitorModel>();
public IList<MonitorModel> Models
{get{if (_models.Count == 0){_models = _dataService.GetData(s => s.Models.Where(m => m.IsEnabled == true).ToList().ToMonitorModelList());}return _models;}
}private DataService _dataService;
public LocalFileMonitor(IProductService productService) : base()
{_dataService = new DataService(productService);
}

转载于:https://www.cnblogs.com/tylerxue/p/5813172.html

使用锁实现多线程共用一个数据源相关推荐

  1. mysql多线程使用一个链接_探索多线程使用同一个数据库connection的后果

    在项目中看到有用到数据库的连接池,心里就思考着为什么需要数据库连接池,只用一个连接会造成什么影响?(只用一个connection)? 1  猜想:jdbc的事务是基于connection的,如果多线程 ...

  2. linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量

    //包含头文件 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *r ...

  3. c语言的锁和Python锁,Python中全局解释器锁、多线程和多进程

    全局解释器锁(GIL)只允许1个Python线程控制Python解释器.这也就意味着同一时间点只能有1个Python线程运行.如果你的Python程序只有一个线程,那么全局解释器锁可能对你的影响不大, ...

  4. python 线程锁_python多线程编程(3): 使用互斥锁同步线程

    问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的 ...

  5. java同步锁synchronized_synchronized、锁、多线程同步的原理是咋样的?

    先综述个结论:一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能.一般说synchro ...

  6. java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务

    java项目中如何利用多线程实现一个定时器任务 发布时间:2020-11-10 16:04:03 来源:亿速云 阅读:86 作者:Leah 今天就跟大家聊聊有关java项目中如何利用多线程实现一个定时 ...

  7. atomic、锁、多线程

    [TOC] @(iOS开发学习)[温故而知新] 一:atomic是线程安全的吗 atomic所说的线程安全只是保证了属性的getter和setter存取方法的线程安全,并不能保证整个对象是线程安全的. ...

  8. python 线程锁_Python多线程-线程锁

    多线程修改一份数据时需要用到线程锁,以防止数据修改出错 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threa ...

  9. python 线程锁_Python3多线程执行任务含线程同步锁

    Python启动多线程执行任务,用线程锁实现同步分配任务,最后等待所有线程执行完毕#python3多线程演示 import threading import random import time to ...

最新文章

  1. LED调光,PFM即pulse frequence modulation
  2. 034_Tabs标签页
  3. VS项目属性的一些配置项的总结(持续增加。。。)
  4. input Type
  5. linux挑战:历史命令_博客挑战:分享您关于社区运作方式的知识
  6. Eclipse如何新建TOMCAT并配置Server Locations和Publishing属性
  7. 函数2——*args/**kwargs、作用域、函数的嵌套、关键字globa和nonlocal、函数的注释...
  8. Linux内核开发者大会 开始报名啦~
  9. android studio for android learning (十二) 查看并获取联系人信息
  10. 【常用Dos命令操作】操作+图(1)
  11. ad输出光绘文件_AD输出文件教程
  12. 蓝牙耳机哪种款式好用?目前口碑超赞的4款蓝牙耳机
  13. matlab中求最小值min函数的使用详细介绍(附matlab代码)
  14. XCTF-高手进阶区:mfw
  15. 联想笔记本PE启动热键
  16. 第三章微分中值定理与导数应用
  17. Unity游戏教程初步(八):Animator的使用
  18. 计算机主机箱中所有配件,电脑主机内部有哪些配件
  19. 解析腾讯视频加密播放
  20. 自监督学习(十)Unsupervised Learning of Visual Representations by Solving Jigsaw Puzzles

热门文章

  1. Google VR全景图片与视频功能开发详解
  2. Context完全解析
  3. 蚂蚁森林消息气泡_元气森林靠代工借单品蹿红 成立3年估值40亿元如今自建工厂...
  4. java 获取_java获取类的信息
  5. python的最大绘图速度_Python数据可视化之高速绘图神器PyQtGraph库,强烈建议收藏...
  6. mysql to double_MySQL令人咋舌的隐式转换 - 惊觉...
  7. mysql可以打开dbt么_dbt 基本试用
  8. linux教程for语句,Shell脚本for循环语句简明教程
  9. inline-block什么意思中文_css中inline-block是什么?inline-block布局的使用
  10. win2003 ip安全策略