内容简介:采用单例模式(Singleton Parttern)设计这种方式的优点:关于线程安全下的单例模式的使用,参考文章:
未登录的客户端线程池
采用单例模式(Singleton Parttern)设计 未登录的客户端线程池 ,采用静态内部类的形式保证其线程安全。之所以静态内部类能够保证单例模式的线程安全,是因为 Java 在底层针对类的加载已经做了同步处理,已经是线程安全的了。
这种方式的优点:
- 懒加载,只有在需要的时候进行加载,节省资源
- 在多线程共享使用一个单例时,确保线程安全
关于线程安全下的单例模式的使用,参考文章: http://blog.ihuxu.com/java-singleton-pattern-usages-for-thread-safe/
客户端线程池的主要数据结构
基于链表的阻塞队列(Linked Blocking Queue)
需要声明一个数据结构来存放“未登录的客户端”(以下简称“数据”),对于其中的“数据”操作有如下特点:
- 先加入的“数据”优先处理,后加入的“数据”次级处理
- 加入的数据量要有一定的限制
- 获取数据时,如果有那么返回,如果没有就阻塞住,直到有数据时再返回
- 添加数据时,如果容量已经达到上限,那么久阻塞,并等待一定时间,如果在达到时间上限之前有可用容量,那么添加数据;否则,报错异常。
根据以上特点,采用BlockingQueue(阻塞队列)协议实现的LinkedBlockingQueue来实现。这种队列是线程安全的,以为底层针对他的操作时已经做了同步的机制。
客户端线程的抽象化
打算按照客户端的状态将客户端的线程进行抽象,比如登录状态(LoggedClient),未登录状态(NotLoggedClient)等等。
由此一来,需要构建一下客户端的状态流转过程。这个状态流转用树型数据结构进行存储,好处在于:
- 能够回溯当前客户端整个证明周期的过程(如果有必要)
- 将状态抽象成树型的数据结构,容易理解整个生命周期
- 将状态抽象成树型的数据结构,可以针对不同分支下的同一个状态进行差异化处理(树型结构下,不同分支下的相同状态会用不同的状态码表示)
同时,也参考下状态机的概念和实现方案:
有限状态机(英语:finite-state machine,縮寫:FSM)又稱 有限状态 自动 机 ,简称 状态机 ,是表示 有限 个 状态 以及在这些 状态 之间的转移和动作等行为的数学模型。
相关示例代码: https://github.com/elimisteve/fsm/blob/master/fsm.go状态机设计
状态值
状态值用32位的有符号(int)整型表示,高8位代表所在的树的深度(根的深度为0),低24位代表当前层级的序号(序号自增,从0开始)
以上所述就是小编给大家介绍的《[ChatXServer开发笔记]2019.01.28》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。