java设计模式之单例模式

单例模式特点:
  1、只能有一个实例。
  2、必须自己创建自己的唯一实例。
  3、必须给所有其他对象提供这一实例。

以下是单例的几种模式

/**
 * 饿汉式
 */
public class Singleton {
    // 私有构造
    private Singleton() {}
    private static Singleton single = new Singleton();
    // 静态工厂方法
    public static Singleton getInstance() {
        return single;
    }
}

饿汉模式 :线程安全,但是效率低

优点:简单,不存在多线程同步问题,避免了synchronized所造成的性能问题;
缺点:当类Singleton被加载的时候,会初始化static的single ,静态变量被创建并分配内存空间之后,这个static的single 对象会一直占用这段内存,当类被卸载时,静态变量被销毁,释放所占有的内存,因此在某些特定条件下会耗费内存。 

/**
 * 懒汉式单例
 */
public class Singleton2 {
    // 私有构造
    private Singleton2() {}
    private static Singleton2 single = null;
    public static Singleton2 getInstance() {
        if(single == null){
            single = new Singleton2();
        }
        return single;
    }
}

懒汉式 : 线程非安全
优点:简单,当类Singleton2被加载的时候,静态变量static的single未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化signle变量,并分配内存,因此在某些特定条件下会节约了内存;
缺点:并发环境下很可能出现多个Singleton2实例。

/**
 * 懒汉式:线程安全
 */
public class Singleton5 {
    // 私有构造方法(防止通过 new Singleton5()去实例化)
    private Singleton5() {
    }
    // Singleton5类型的变量(不初始化,注意这里没有使用final关键字)
    private static Singleton5 instance;
    // 静态的方法(调用时再初始化Singleton5,使用synchronized 避免多线程访问时,可能造成重的复初始化问题)
    public static synchronized  Singleton5 getInstance() {
        if (instance == null) {
            instance = new Singleton5();
        }
        return instance;
    }
}

懒汉式:线程安全

优点:使用synchronized关键字避免多线程访问时,出现多个Singleton5实例。
缺点:同步方法频繁调用时,效率略低。

/***
 * 双重锁模式
 */
public class Singleton4 {
    private Singleton4() { }
    //静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用)
    private static volatile Singleton4 instance;    
    public static Singleton4 getIstance() {     
        if (instance == null) {       
            synchronized (Singleton4.class) {           
                if (instance == null) {
                    instance = new Singleton4();
                }
            }
        }
        return instance;
    }
}

双重锁模式 : 线程安全,效率高

写起来复杂,但是内存占用地,效率高,线程安全,多线程操作原子性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值