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