跟我学代码架构设计模式之--孔氏并发定理

前言:

并发的根本是减少线程阻塞等待的时间,有两种阻塞:

一种是业务上的代码架构设计导致的状态共享加锁导致的阻塞

一种是对特定资源的等待导致的阻塞。

只有同时避免了两种阻塞等待,才能达到真正的并发最大化!

一、如何取消状态共享锁导致的阻塞。

角色:特定时间段、 线程、状态(只读状态数据、可脏写状态数据、安全状态数据)

状态指的是堆区数据,按业务特征可以分为:只读状态数据、可脏写状态数据(业务允许非原子写)、安全状态数据(业务要求必须原子写);面向对象里面的对象数据、全局数据等;

定理定义:

1 同一时间段内,一状态关联一线程,可达到完全高并发

2同一时间段内,一状态关联多线程,对于只读状态数据和可脏写状态数据,可以达到完全高并发

3同一时间段内,一状态关联多线程,对与要求安全状态的数据,不可能达到完全高并发

扫描二维码关注公众号,回复: 9278259 查看本文章

说明:

所谓同一时间段的限定是指:在不同时间段内,状态可以关联不同的线程,只要保证一状态关联一线程的一对一关系即可,不要求状态和某一线程绝对绑定。

定理对程序设计的指导意义:

要想达到完全高并发,只有定理中的1和2满足,所以,

#要么函数(或者说任务)完全设计成无状态的

#要么设计成对状态只读或者允许状态可脏写

#要么设计成一状态关联一线程

然而大部分的业务都要求状态不可脏写,所以最终的完全高并发方案是:一状态一线程!

二、取消对特定资源的等待导致的阻塞

把业务设计成多个任务,每个任务都是非阻塞的,采用消息或者说任务队列来调度任务(见我上篇文章)

即:采用线程+消息队列(任务队列)模型!

三、总结:

高并发的终极设计为:

1 一个有状态的业务逻辑处理对象实例必须关联一个线程,多个线程必须有多个业务逻辑处理对象实例

2 一个线程必须还要有一个消息/任务队列,一个线程多路循环各个业务逻辑处理对象的业务片段,用来取消对资源的等待阻塞。

发布了63 篇原创文章 · 获赞 25 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/w1857518575/article/details/86351701