今天就带大家了解一下并发编程中常用的几种设计模式。1、线程上下文设计模式我们不妨通过一个具体的案例,看看在哪些场景下我们需要上下文呢?当执行一个比较长的请求任务时,这个请求可能会经过很多层的方法调用。假设我们需要将第一种方法的中间结果传递给最后一种方法进行计算。一个简单的实现方式是在调用的每个函数中添加这个中间结果的参数,依次向下传递。代码如下:执行结果:除了上面的方法,我们还可以使用ThreadLocal来实现context。ThreadLocal是线程局部变量,可以实现多线程数据隔离。ThreadLocal为每个使用该变量的线程提供一个独立的副本。线程之间的数据是隔离的,每个线程只能访问自己内部的拷贝变量。ThreadLocal中常用的方法有3种:set、get、initialValue。我们可以通过下面这个简单的例子来看看ThreadLocal的使用:接下来,我们使用ThreadLocal重新实现原来的context设计。你会发现我们在这两个方法中并没有通过变量传递上下文,只是通过ThreadLocal获取了当前线程的上下文信息:运行结果:2.Thread-Per-Message设计模式翻译自Thread-Per-消息设计模式意思是一个线程一条消息的意思。比如我们在处理Socket通信时,通常是一个线程来处理事件监听和I/O读写。如果I/O读写操作非常耗时,这个时间会影响事件监听和处理事件。这时候Thread-Per-Message模式就可以很好的解决这个问题。一个线程监听I/O事件,每当监听到一个I/O事件,就交给另一个处理线程去执行I/O操作。下面,我们还是通过一个例子来学习这个设计模式的实现。3、Worker-Thread设计模式这里,Worker是worker的意思,意思是在WorkerThread设计模式下,会有一些worker(线程)继续轮流处理工作。当没有工作时,worker会处于等待状态,直到有新的工作进来。WorkerThread设计模式除了worker角色,还包括pipelines和products。假设某物流仓库的物流分拣线上有8台机器人,它们不断地从线上取包裹、打包,然后送到小车上。当仓库中的货物打包后,会被放到物流分拣线上,而不是直接交给机器人,机器人会从线上随机分拣包裹。代码如下:一般来说,如果我们需要传递或隔离一些线程变量,可以考虑使用上下文设计模式。在数据库读写分离的业务场景中,ThreadLocal常用于动态切换数据源。但是在使用ThreadLocal的时候,需要注意内存泄漏的问题。我们在前面的解释中已经讨论过这个问题。当主线程处理每个请求都非常耗时时,可能会出现阻塞问题。这时候可以考虑将主线程业务划分为新的业务线程,以提高系统的并行处理能力。Thread-Per-Message设计模式和Worker-Thread设计模式都是通过多线程分工来提高系统并行处理能力的设计模式。
