GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1025|回复: 22
收起左侧

[技术交流] 【java】单例模式和建造者模式的应用-基于线程池的简易并发通信服务框架

[复制链接] |关注本帖

寻觅眼镜蛇图腾香喷喷的烤鸡牧羊人GM論壇榮譽勛章山猫图腾猎鹰图腾

     楼主| 白冥 发表于 2024-5-31 01:29:10 | 显示全部楼层 |阅读模式 |取消关注该作者的回复
    本帖最后由 白冥 于 2024-5-31 02:07 编辑

    观前科普
            单例模式(Singleton Pattern),是一种创建型设计模式,为了保证一个类至始至终都只能有一个唯一实例即如果你试图实例化这个类,总是只能得到同一个实例对象
            因此,我们私有化这个类的构造方法,并且提供一个公有静态方法充当全局访问点,方便在程序的任何地方都可以且只能通过这唯一一种全局访问点获取这个实例

            
    为什么我们非要好死不死地控制一个类的实例对象的数量?至于吗?

            生活中我们总是会接触到一些共享资源,如共享单车、共享充电宝、共享文件......,资源是共享的,但也是有限的,当一个多个程序访问某一项共享资源时,我们有必要控制这些共享资源的访问权限。在这个例子中,对于客户端,服务端本身就是一个严格的共享资源,如果外界可以肆意创建一个或多个服务端,会造成严重的并发问题。

    为什么我们只提供一个唯一的全局访问点?
            单例模式让类的唯一实例不可变。在并发编程中,比如函数直接修改、充当参数在函数内部被修改、文件读写、网络通信和打印输出等,任何程序都可能覆盖一个实例对象的原有代码,导致代码难以理解和维护。你不会想让一个问题代码散落在程序各处,竞争条件和不一致状态,增加了并发控制的复杂性。
            由于单例模式同时解决了两个问题,所以违背五个基本设计原则单一职责原则
    如何使用?
    单例模式有两种实现方式,一种称为饿汉式,一种称为懒汉式。
    这里给出两种实现方法。
    饿汉式
        public class Singleton {
            private static Singleton instance = new Singleton ( );  
            private Singleton ( ) { }  
            public static Singleton getInstance( ) {  
                return instance;  
            }  
        }
    饿汉式的优点是实现方式相对简单,易于理解,获取对象的速度快,且是线程安全的;缺点是如果该类从未被使用,那么其创建的实例就会浪费系统资源。
    懒汉式 (非双重检查锁定)

        public class Singleton {  
            private static Singleton instance;  
            private Singleton ( ) { }  
            public static Singleton getInstance ( ) {  
                if (instance == null) {  
                    instance = new Singleton ();  
                }  
                return instance;  
            }  
        }

    懒汉式(非双重检查锁定)的优点是只有在需要使用时才会创建实例,避免了资源的浪费;缺点是在多线程环境下,如果不进行适当的同步,可能会创建多个实例。
    懒汉式(双重检查锁定)

        public class Singleton {  
            private static Singleton instance;  
            private Singleton ( ) { }  
            public static Singleton getInstance ( ) {  
                if (instance == null) {  
                    synchronized (Singleton.class) {
                        if (instance == null) {
                            instance = new Singleton ( );
                        }
                    }  
                }  
                return instance;  
            }  
        }

    懒汉式(双重检查锁定)的优点是只有在需要使用时才会创建实例,同时减少了不必要的同步开销避免了资源的浪费;缺点是降低性能,增加了实现的复杂性。
    需要注意的是,双重检查锁定在某些旧的Java版本或特定的JVM实现中可能不起作用,因为它依赖于JVM的内存模型。
    至于建造者模式,此前已经科普过,这里不再赘述。
    代码的全部功能
          使用双重检查锁定(Double-Checked Locking)实现单例模式,确保只有一个CommunicationServer实例在运行。
            在私有构造函数中初始化ServerSocket以监听特定端口(默认8080)。
            handleConnection方法启动一个线程,不断接受客户端连接,并为每个连接创建一个ClientHandler对象,该对象负责处理与特定客户端的通信。
            sendMessageToClient方法允许服务器向指定客户端发送消息。
            使用ExecutorService来并发处理客户端连接。
            使用ConcurrentHashMap来存储客户端处理程序,以及AtomicInteger来生成唯一的客户端ID,以确保并发安全性。
            close方法用于关闭服务器,包括关闭所有客户端连接、停止线程池和清理资源。
            客户端连接由ClientHandler类处理,该类实现了消息接收和处理的逻辑。
            Message类的所有字段都被声明为final,这意味着一旦Message对象被创建,其状态就不能再改变。这有助于保证数据的完整性和一致性。
            Message类用于表示传输的消息,包含发件人、收件人、主题、内容等字段,支持附件,包括附件的名称、大小和文件内容。
            在MessageBuilder的setAttachment方法中,从文件读取附件内容并将其作为字节数组存储在消息中。
            使用构建器模式来创建Message对象,使代码更易于阅读和维护。
            Message类实现了Serializable接口,使其可以通过套接字发送。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
      收起(1)
    回复

    使用道具 举报

    石肤术金猪猪储蓄罐㊖实现梦想業火死鬥魔法不朽·传奇不熄卡洛斯·奥利维拉白野威十年一梦官复原职男巫之歌

      回复

      使用道具 举报

      诺克提斯·路西斯·伽拉姆Forever Titanic業火死鬥钢铁侠永远的克叔极·龙の意死灵之书卡利亚权杖虚空之海的鲸史莱姆牧场

        回复

        使用道具 举报

        百相千面-晦永远的克叔業火死鬥实现梦想官复原职虚空之海的鲸Zootopia幸运女神的微笑『逆境中的幸运女神』御医神兔

          代码部分有很多乱码,强烈推荐把代码贴进来的时候使用纯文本模式编辑帖子
            收起(3)
          回复

          使用道具 举报

          GM論壇初心者畢業證書牧羊人

            仿佛又在上,数据结构的课
            回复

            使用道具 举报

            金猪猪储蓄罐㊖炼金之心魔眼护符骑兽之子召唤古代战士近地夜航元气菠菜人烈焰天使弓龙血指环『灰域来音』

              回复

              使用道具 举报

              魔法石碑吃饱的小阿尔驯化黑龙幼崽新月护符森林羊男夜灯牧羊人近地夜航

                回复

                使用道具 举报

                缘起星空虚空之海的鲸

                  论坛没有专门的程序员,后台的东西好像就是坛花一个人弄,能凑合用就行了吧
                  回复

                  使用道具 举报

                  阿怪GHOST吃饱金币的Doge秘密空瓶裸体克里斯【圣诞限定】心心念念小雪人【夏日限定】夏日的泰凯斯史莱姆牧场虚空之海的鲸不朽之恋

                    回复

                    使用道具 举报

                    雾都血医人到中年卡洛斯·奥利维拉王者之盾小小安全帽金牌矿工『伊黎丝的赞词』极·龙の意神奇四叶草

                      回复

                      使用道具 举报

                      咆哮诅咒粉猪猪储蓄罐㊖Futūrum(未来)果体76文森特‧瓦伦丁永远的克叔里昂‧S‧甘乃迪传说的黑道-桐生一马

                        回复

                        使用道具 举报

                        牧羊人森林羊男腐化龙蛋香喷喷的烤鸡皮尔斯‧尼凡斯威克多尔·克鲁姆.瑞雪兆丰年,生灵万物新【新手友好】昆進

                          回复

                          使用道具 举报

                          脉律辐石劫掠核芯御医神兔粉猪猪储蓄罐㊖亚瑟‧摩根亚当‧简森Forever Titanic月光骑士月光骑士擎天柱(Peterbilt389).

                            回复

                            使用道具 举报

                            史莱姆牧场吸血魔蝠蒂法·洛克哈特苏醒的格罗姆圣甲虫秘典可爱黑猫萨菲罗斯夏日柯基龙腾世纪:审判

                              回复

                              使用道具 举报

                              亚索月影狼晓月终焉旅行骰子!卡利亚权杖

                                用纯文本模式编辑应该能减少一些排版问题,或者代码部分用截图展示之类的。
                                回复

                                使用道具 举报

                                  回复

                                  使用道具 举报

                                  小丑与格雷与星光璀璨金猪猪储蓄罐㊖幸运女神的微笑十周年扭蛋 - 红『私有海域』『钜鲸』『召唤好运的角笛』『落樱缤纷』

                                    回复

                                    使用道具 举报

                                    丹妮莉丝·坦格利安格拉迪欧拉斯雪王的心脏『星河碎片』『灰域来音』预知水晶球炽天使之拥『伊黎丝的赞词』纯真护剑『随时随地开启!』

                                      回复

                                      使用道具 举报

                                      守护者三角头小小安全帽吃饱金币的Doge『终点站:极地』近地夜航内森·德雷克老旧的怀表男巫之歌落雪勇者与龙的传说-第一页雄躯的昇格

                                        让我想起了在黄色网站讲高数的那个数学老师
                                        回复

                                        使用道具 举报

                                        阿怪崩朽之青铜龙王妙手空空泰比里厄斯双重身份肉垫手套不灭狂雷神奇传送镜小小舞台喷涌的粪桶

                                          我期待在下面回文看到各种代码大佬的天书回文,拚出美妙的火花...结果没有
                                          回复

                                          使用道具 举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2024-11-15 16:59 , Processed in 0.134847 second(s), 142 queries , Redis On.

                                          Copyright © 2013-2024 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表