单例模式

单例模式的关键点

1) 构造方法不对外开放,为private(调用不能用new)

2) 确保单例类只有一个对象,尤其是多线程模式下

3) 通过静态方法或枚举返回单例对象

4) 确保单例类在反序列化是不会重新创建新的对象

单例模式的实现方式

1) 饿汉式

public class Singleton1 {

/*

* 饿汉式是在声明的时候就已经初始化Singleton1,确保了对象

的唯一性

*

* 声明的时候就初始化对象会浪费不必要的资源

* */

private static Singleton1 instance = new Singleton1();

private Singleton1() {

}

// 通过静态方法或枚举返回单例对象

public Singleton1 getInstance() {

return instance;

}

}

2) 懒汉式

public class Singleton2 {

private static Singleton2 instance;private Singleton2() {

}

/*

* getInstance 添加了synchronized 关键字,,也就是说

getInstance 是一个同步方法,

* 这就是懒汉式在多线程中保持唯一性的方式

*

* 懒汉式存在的问题是,即是instance已经被创建,每次调用

getInstance方法还是会同步,这样就会浪费一些不必要的资源

* */

public static synchronized Singleton2 getInstance() {

if (instance == null) {

instance = new Singleton2();

}

return instance;

}

}

双重检查

线程安全式中,同步了整个getInstance方法才保证了线程安全,会浪

费很多性能。于是我们可以使用双重检查式,它将只在初次创建实例的

时候实现同步。(了解锁优化的同学可以理解为减少锁的颗粒度)

public class SingletonLH {

private static SingletonLH singleton = null;

private SingletonLH() {}

public static SingletonLH getSingleton1() throws

InterruptedException {

if (singleton == null) {

synchronized (SingletonLH.class) {

if (singleton == null) {

singleton = new

SingletonLH();

}

}

}

return singleton;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值