###涉及概念mysql
SynchronizeContext 同步上下文redis
TaskScheduler 调度器sql
Task 任务缓存
一个Context 下有一个调度器,默认是 ThreadPool Scheduler 线程池调度器 ThreadPoolTaskScheduler安全
当向DefaultTask 调度器中Post Task的时候,Task会被调动到线程池中的某个WorkThread上去网络
所以多个Task访问数据存在线程安全的问题多线程
每一个Task执行须要将自身扔个调度器处理,一般两种 ThreadPool 调度器和 SynchronizationContext 调度器异步
SynchronizationContext 调度器至关于提供了一个Hook点,能够对任务的调度作一些处理async
SynchronizationContext 自己是线程局部变量,保证了Context和线程绑定线程
其默认实现,也是使用线程池来调度执行Task
要保证一个 SynchronizationContext 下全部任务没有线程冲突,就须要重写 SynchronizationContext 的Post方法
当调度器向其Post Task 来执行的时候,经过锁,来确保当前没有其它Task执行,来保证数据访问的安全性
网络应用程序中,很容易出现线程访问问题,主要缘由:
1:网络IO须要有线程处理
2:业务逻辑自己在其它线程中处理
3:业务逻辑async 异步方式,使用到了线程池调度
这些状况就会致使多线程资源访问的问题
解决方法:
1:根据Service 来划分资源管理,一组资源同时只能有一个Task处理
2:状态资源全局化,内存无缓存状态,状态都存储在redis或者mysql之类的外部数据仓库中,外部仓库自身保证多线程数据安全