单一模式可以通过以下方式实现:
懒惰的单例模式;线程安全的懒惰单例模式:双检测锁实现单例模式;饥饿的独生子女模式;静态类实现单例模式;枚举单例模式。
详情如下:
懒惰单例模式
惰性单例模式,即对象只在需要使用时才初始化。
线程安全的懒惰单例模式
为了确保线程安全,我们可以锁定getInstance方法:
这样确实可以保证多线程情况下的线程安全,但是这样一来,每次调用getInstance方法获取实例对象时,都会进行锁操作,会造成比较大的开销。事实上,只有在初始化实例对象时才需要锁。
双检测锁实现单例模式
我们将锁定位置后移,在检查变量是否已初始化时不锁定,只在变量未初始化需要初始化时锁定;这样,就不需要锁定getinstance方法或获取实例对象,从而降低了性能消耗。
饥饿的单身模式
饥饿单例模式是在加载类时创建并初始化单例对象。其代码如下:
静态类实现单例模式。
使用静态内部类利用了Java静态内部类的特性:当Java加载外部类时,它不会创建内部类的实例,而只是在外部类使用内部类时才创建。其代码如下:
枚举单一模式
使用枚举实现单例模式利用了枚举的特性:全局唯一性。其代码如下:
什么是单一案例?
在实例化一个单例类之后,您在堆中获得相同的实例对象。通俗点说,这个singleton的所有实例化引用都指向堆内存中的一个实例对象。
使用场景:对象需要频繁实例化和销毁。这时候考虑使用单例可以大大提升性能。
优势:
因为只有一个实例对象,所以占用的内存很少。
对象不必重复new,这当然解放了资源的重复占用,提高了性能。
缺点:
扩展性差,每次想扩展都要改代码。
的使用场景比较单调。如果是多个场景下不断变化的实例对象,最好不要用单个实例,数据容易出问题。
最好不要使用连接池。n多个对象共享一个连接池,容易导致连接池溢出。