首页 > 其他 > 详细

单例设计模式

时间:2021-04-10 22:11:16      阅读:21      评论:0      收藏:0      [点我收藏+]

一.什么是单例模式

单例模式是一种常见的设计模式,其定义是单例对象的类只允许一个实例存在。

技术分享图片

 

 单例模式的实现主要通过两个步骤实现:

1.将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;

2.在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用

二、单例模式的应用场景

            举一个例子,网站的计数器,一般也是采用单例模式实现,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。同样多线程的线程池的设计一般也是采用单例模式,这是由于线程池需要方便对池中的线程进行控制

            同样,对于一些应用程序的日志应用,或者web开发中读取配置文件都适合使用单例模式,如HttpApplication 就是单例的典型应用。

三、单例模式的优缺点

            优点

           1.内存中只存在一个对象,节省空间

            2.避免频繁创建销毁对象,浪费性能

            3.为整个系统提供一个全局的访问点

            缺点

           1.不适合变化频繁的对象

            2.如果被实例化的对象长时间不用,会被垃圾回收造成对象状态的丢失

四、单例模式的实现

           1.饿汉式

     //饿汉加载

public class Singleton1 {
private static Singleton1 singleton1 = new Singleton1();
 
private Singleton1() {
    }

public static Singleton1 getSingleton1() {
return singleton1;
}
}
在上述单例类被加载时,就会实例化一个对象并交给自己的引用,供系统使用;而且,由于这个类在整个生命周期中只会被加载一次,因此只会创建一个实例,即能够充分保证单例

优点:操作简单,不会有线程同步问题
缺点:不管需不需要使用这个类都会被加载,造成了内存的浪费。

2.懒汉式
public class Singleton2 {
private static Singleton2 singleton2;

private Singleton2() {
}

public static Singleton2 getSingleton2() {
if (singleton2 == null) {
singleton2 = new Singleton2();
}
return singleton2;
}
}
只有在使用的时候才会实例化一个对象交给自己的引用,但是可能会造成线程安全问题,在一个线程进入if判断的时候另一个线程也进入了就会创建两个对象,所以只能在单线程情况下使用。

        3.双重加锁机制    

public class Singleton3 {
private static Singleton3 singleton3;
private static ReentrantLock reentrantLock = new ReentrantLock();

private Singleton3() {
}

public static Singleton3 getInstance() {

if (singleton3 == null) {
reentrantLock.lock();
try {
if (singleton3 == null) {
singleton3 = new Singleton3();
}
} finally {
reentrantLock.unlock();
}
}
return singleton3;
}
}

如代码中所示,我们进行了两次if (singleton3 == null)检查,这样就可以保证线程安全
应该把singleton3加上volatile关键字修饰保证数据的原子性,因为在创建Singleton3时不是原子操作,肯能导致指令重排,不能保证线程安全。

当然实现单例模式的方法还有很多,这几种比较经典,欢迎补充。

      

单例设计模式

原文:https://www.cnblogs.com/zhangmeng0726/p/14642138.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!