跳至主要內容
Active Object

目的

活动对象设计模式使每个驻留在其控制线程中的对象的方法执行与方法调用脱钩。 目的是通过使用异步方法调用和用于处理请求的调度程序来引入并发。

解释

实现活动对象模式的类将包含自同步机制,而无需使用“同步”方法。

真实世界例子

兽人以其野性和顽强的灵魂而著称。 似乎他们有基于先前行为的控制线程。

要实现具有自己的控制机制线程并仅公开其API而不公开自己的执行,我们可以使用活动对象模式。

程序示例


iluwatar大约 1 分钟ConcurrencyPerformance
Async Method Invocation

意图

异步方法调用是一个调用线程在等待任务结果时不会阻塞的模式。模式为多个独立的任务提供并行的处理方式并且通过回调或等到它们全部完成来接收任务结果。

解释

真实世界例子

发射火箭是一项令人激动的事务。任务指挥官发出了发射命令,经过一段不确定的时间后,火箭要么成功发射,要么惨遭失败。

通俗地说

异步方法调用开始任务处理,并在任务完成之前立即返回。 任务处理的结果稍后返回给调用方。

维基百科说


iluwatar大约 3 分钟ConcurrencyReactive
Balking

意图

止步模式用于防止对象在不完整或不合适的状态下执行某些代码。

解释

真实世界例子

洗衣机中有一个开始按钮,用于启动衣物洗涤。当洗衣机处于非活动状态时,按钮将按预期工作,但是如果已经在洗涤,则按钮将不起任何作用。

通俗地说

使用止步模式,仅当对象处于特定状态时才执行特定代码。

维基百科说

禁止模式是一种软件设计模式,仅当对象处于特定状态时才对对象执行操作。例如,一个对象读取zip压缩文件并在压缩文件没打开的时候调用get方法,对象将在请求的时候”止步“。


iluwatar大约 2 分钟ConcurrencyDecoupling
Commander

目的

用于处理执行分布式事务时可能遇到的所有问题。

类图

Commander class diagram

适用场合

当我们需要提交两个数据库去完成事务,提交不是原子性且可能因此造成问题时,适合用这个设计模式。

解释

处理分布式事务很棘手,但如果我们不仔细处理,可能会带来不想要的后果。假设我们有一个电子商务网站,它有一个支付微服务和一个运输微服务。如果当前运输可用,但支付服务不可用,或者反之,当我们已经收到用户的订单后,我们应该如何处理?我们需要有一个机制来处理这些情况。我们必须将订单指向其中一个服务(在这个例子中是运输),然后将订单添加到另一个服务的数据库中(在这个例子中是支付),因为两个数据库不能原子地更新。如果我们当前无法做到这一点,应该有一个队列,可以将这个请求排队,并且必须有一个机制,允许队列中出现失败。所有这些都需要通过不断的重试,在保证幂等性(即使请求多次,变化只应用一次)的情况下,由一个指挥类来完成,以达到最终一致性的状态。


iluwatar大约 1 分钟ConcurrencyCloud distributed
Monitor

或称

监控对象模式

目的

主要目的是为多个线程或进程提供一种结构化和受控的方式来安全地访问和操作共享资源,例如变量、数据结构或代码的关键部分,而不会导致冲突或竞争条件。

解释

通俗的说

监视器模式用于强制对数据进行单线程访问。 一次只允许一个线程在监视器对象内执行代码。

维基百科说

在并发编程(也称为并行编程)中,监视器是一种同步构造,它允许线程具有互斥性和等待(阻止)特定条件变为假的能力。 监视器还具有向其他线程发出信号通知其条件已满足的机制。


iluwatar大约 4 分钟ConcurrencyPerformance
Producer Consumer

目的

生产者消费者设计模式是一种经典的并发模式,通过将工作与执行工作任务分开来减少生产者与消费者之间的耦合。

类图

Producer Consumer

适用性

在以下情况下使用生产者消费者

  • 通过将工作分成生产和消费两个工作进程来解耦系统
  • 解决生产工作和消费工作需要不同时间的问题

iluwatar小于 1 分钟ConcurrencyReactive
Version Number

名字 / 分类

版本号

或称

实体版本控制,乐观锁。

目的

解决多个客户端尝试同时更新同一实体时的并发冲突。

解释

现实世界的例子

爱丽丝(Alice)和鲍勃(Bob)正在管理书,该书存储在数据库中。 我们的英雄们正在同时进行更改,我们需要某种机制来防止他们相互覆盖。

通俗地说

版本号模式可防止对同一实体进行并发更新。


iluwatar大约 3 分钟ConcurrencyData accessMicroservices