设计模式中单例模式设计时需要注意的5个问题

2021-10-08 - kblog

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

在使用单例模式设计时需要注意一下几点:

第一、有状态单例和无状态单例

根据功能,单例类可以分为有状态单例类和无状态单例类。
 
■ 有状态单例类
一个有状态单例类的对象一般是可变的,通常当做状态库使用。例如,给系统提供一个唯一的序列号。
 
■ 无状态单例类
无状态单例类是不变的,通常用来提供工具性的功能方法。例如, IO或数据库访问等。因为单例类具有状态,所以在使用时应注意以下两点。
 

第二、多个JVM中会出现多个单例对象,集群时需要注意数据同步

单例类仅局限于一个JVM,因此当多个JVM的分布式系统时,这个单例类就会在多个JVM中被实例化,造成多个单例对象的出现。如果是无状态的单例类,则没有问题,因为这些单例对象是没有区别的。如果是有状态的单例类,则会出现问题,例如,给系统提供一个唯一的序列号,此时序列号不唯一,可能出现多次。因此,在任何使用EJB、RMI和JINI技术的分布式系统中,应当避免使用有状态的单例类。
 

第三、同一个JVM中多个类加载器加载可能会导致出现多个单例对象

同一个JVM中会有多个类加载器,当两个类加载器同时加载同一个类时,会出现两个实例,此时也应尽量避免使用有状态的单例类。
 

第四、使用单例不能实现Cloneable和Serializable接口

另外,使用单例模式时,需要注意序列化和克隆对实例唯一性的影响。如果一个单例的类实现了Serializable或Cloneable接口,则有可能被反序列化或克隆出一个新的实例来,从而破坏了“唯一实例”的要求,因此,通常单例类不需要实现Serializable和Cloneable接口。
 

第五、饿汉式单例生成对象时需要注意的问题

一个饿汉式单例类在多线程调用的时候,在生成的时候要使用synchronized对该方法进行线程同步,否则会导致不同的线程将单例的对象属性数据进行相互覆盖。

- END -

5

微服务中消息总线架构设计应用

微服务中消息总线架构设计应用

当一个O2O电商系统到达一定规模之后,就需要考虑系统的可扩展性、松耦合和组件化。一般采用的都是基于时下比较流行SpringCloud和Dubbo的分布式的微服务的架构模式,虽然模块间能够独立部署了,但是模块间的还是强依赖关系,每次改动都需要重新发版上线,产品迭代速度又快,使用分布式的消息总线设计就可以解决这些问题。