Java性能 -- 并发设计模式
线程上下文模式
- 线程上下文指的是贯穿线程整个生命周期的对象中的一些全局信息,如Spring中的ApplicationContext
- 可以使用
ThreadLocal
实现上下文- ThreadLocal是线程本地变量,可以实现多线程的数据隔离,每个线程只能访问各自内部的副本变量
Thread-Per-Message模式
- 一个消息一个线程
- 在Socket通信中,一个线程监听IO事件,每当监听到一个IO事件,就交给另一个处理线程执行IO操作
- 如果遇到高并发,就会出现严重的性能问题,因为线程在操作系统中也是昂贵的资源,不能无限制地创建
- 如果针对每个IO请求都创建一个线程来处理,在有大量请求同时进来时,就会创建大量线程
- 每次请求都需要创建和销毁线程,性能开销很大
- 可以使用线程池来代替线程的创建和销毁
ServerHandler
1 |
|
Server
1 | public class Server { |
Worker-Thread模式
- Worker是工人的意思,代表在Worker-Thread模式中,会有一些工人不断轮流处理过来的工作
- 当没有工作时,工人会处于等待状态,直到有新的工作进来
- 除了工人角色,Worker-Thread模式还包括了流水线和产品
- 相比于Thread-Per-Message模式
- 可以减少频繁创建、销毁线程所带来的性能开销
- 也能避免无限制创建线程所带来的内存溢出风险
Package
1 |
|
Worker
1 | public class Worker extends Thread { |
PackageChannel
1 | public class PackageChannel { |
Test
1 | public class Test { |
Future模式
Task
1 | public interface Task<T, P> { |
TaskService
1 | public interface TaskService<T, P> { |
Future
1 | public interface Future<T> { |
FutureTask
1 | public class FutureTask<T> implements Future<T> { |
TaskServiceImpl
1 | public class TaskServiceImpl<T, P> implements TaskService<T, P> { |
TaskA
1 | public class TaskA<T, P> implements Task<T, P> { |
App
1 | public class App { |
参考资料
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.