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

前言:

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

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

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

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

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

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

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

定理定义:

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

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

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

说明:

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

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

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

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

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

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

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

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

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

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

 

三、总结:

高并发的终极设计为:

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值