重复消费原因
根本原因:已经消费了数据,但是offset没提交。
正常来说,scoket客户端打开一个输出流,如果不做约定,也不关闭它,那么服务端永远不知道客户端是否发送完消息,那么服务端会一直等待下去,直到读取超时。
所以怎么告知服务端已经发送完消息就显得特别重要。
只有一个实例
1.volatile能够保证变量的可见性,但是并不能保证变量的原子性和有序性。
2.它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
3.它会强制将对缓存的修改操作立即写入主存;
4.如果是写操作,它会导致其他CPU中对应的缓存行无效。
通过复制生成实例
工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
Builder模式功能是组装复杂的实例,重点关注过程,一共存在3个角色:Bulider(建造者)、 ConcreteBuilder(具体建造者)、 Dirctor(监工)
在Abstract Factory模式中,存在抽象工厂和抽象产品