单例模式

单例

保证一个类仅有一个实例,并提供一个全局访问点,属于创建者模式

使用案例

数据库连接池等等

实现方法

懒汉模式(线程不安全)

  • 默认的构造函数中添加了私有属性private
  • 多个访问者同时获取对象实例会造成多个同样的实例并存
1
2
3
4
5
6
7
8
9
10
11
public class Singleton {
private static Singleton instance;

private Singleton_01() { }

public static Singleton getInstance() {
if (null != instance) return instance;
instance = new Singleton();
return instance;
}
}

懒汉模式(线程安全)

相对上一种实现方法在获取实例方法前使用了synchronized关键字,但这种模式由于上锁会导致资源浪费,不建议使用

1
2
3
4
5
6
7
8
9
public class Singleton {
private static Singleton instance;
private Singleton() { }
public static synchronized Singleton getInstance(){
if (null != instance) return instance;
instance = new Singleton();
return instance;
}
}

饿汉模式(线程安全)

在程序启动的时候直接运⾏行行加载,后续有外部需要使⽤用的时候获取即可,但不是懒加载,会造成性能上的损失

1
2
3
4
5
6
7
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() { }
public static Singleton getInstance() {
return instance;
}
}

使用类的内部类(线程安全)

是一种比较好的方式

既保证了线程安全又保证了懒加载,同时不会因为加锁的方式耗费性能(因为JVM保证了一个类的构造方法在多线程环境下能够被正确的加载)

1
2
3
4
5
6
7
8
9
10
11
public class Singleton {
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}

private Singleton() { }

public static Singleton getInstance() {
return SingletonHolder.instance;
}
}

双重锁校验(线程安全)

懒汉模式(线程安全)方法级锁的优化,减少了部分获取实例的耗时,同时也满足了懒加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Singleton {
private static Singleton instance;

private Singleton() { }

public static Singleton getSingleton() {
if(instance == null) return instance;
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
return instance;
}
}
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2019-2021 子夜
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信