生产者消费者模式
实现方式
Object的wait/notify/notifyAll
- 基于Object的wait/notify/notifyAll与对象监视器(Monitor)实现线程间的等待和通知
- 这种方式实现的生产者消费者模式是基于内核实现的,可能会导致大量的上下文切换,性能不是最理想的
Lock中Condition的await/signal/signalAll
- 相对于Object的wait/notify/notifyAll,更推荐JUC包提供的Lock && Condition实现的生产者消费者模式
- Lock && Condition实现的生产者消费者模式,是基于Java代码层实现的,在性能和扩展性方面更有优势
BlockingQueue
- 简单明了
限流算法
漏桶算法通过限制容量池大小来控制流量,而令牌桶算法则通过限制发放令牌的速率来控制流量
漏桶算法
- 请求如果要进入业务层,就必须经过漏桶,而漏桶出口的请求速率是均衡的
- 如果漏桶已经满了,请求将会溢出,不会因为入口的请求量突然增加而导致系统崩溃
令牌桶算法
- 系统以一个恒定的速度在一个桶中放入令牌,一个请求如果要进入业务层,必须要拿到一个令牌
- 当桶里没有令牌可以取时,那么请求会被拒绝
- Guava中的RateLimiter是基于令牌桶算法实现的
装饰器模式
- 装饰器模式能够为对象动态添加新功能,从一个对象的外部给对象添加功能,具有非常灵活的扩展性
- 装饰器模式还能够实现对象的动态组合
URL
IDecorator
1 2 3
| public interface IDecorator { void decorate(); }
|
Decorator
1 2 3 4 5 6 7
| public class Decorator implements IDecorator {
@Override public void decorate() { System.out.println("Decorator"); } }
|
BaseDecorator
1 2 3 4 5 6 7 8 9 10 11
| @AllArgsConstructor public class BaseDecorator implements IDecorator { private IDecorator decorator;
@Override public void decorate() { if (decorator != null) { decorator.decorate(); } } }
|
ADecorator
1 2 3 4 5 6 7 8 9 10 11 12
| public class ADecorator extends BaseDecorator {
public ADecorator(IDecorator decorator) { super(decorator); }
@Override public void decorate() { System.out.println("ADecorator"); super.decorate(); } }
|
BDecorator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class BDecorator extends BaseDecorator {
public BDecorator(IDecorator decorator) { super(decorator); }
@Override public void decorate() { System.out.println("BDecorator"); super.decorate(); }
public static void main(String[] args) { new BDecorator(new ADecorator(new Decorator())).decorate(); } }
|
参考资料
Java性能调优实战