单例模式
单例设计模式属于创建型模式中的一种,它提供了一种创建对象的最佳模式。
这种设计模式保证了只有单个对象被创建,解决了全局使用的类被频繁的创建以及销毁,可以控制实例的数量,并节省系统资源。
最重要的两点:
- 保证构造函数私有化,外部无法创建对象。
- 提供静态方法,供外部调用。
实现方法(常见)
懒汉式
优点:该实现方式在实例被调用时才创建对象,节省了内存资源 。
缺点:只有在使用synchronized关键字时才能保证线程安全,降低了使用效率。
/**
* 懒汉式
* 在该类被调用时才创建对象
*
*/
public class SingletonOne {
/**
* 私有实例
*/
private static SingletonOne instance;
/**
* 私有构造函数
*/
private SingletonOne() {
}
/**
* 提供给外部的静态方法
* <p>
* 懒汉式通过synchronized 保证了线程安全 但是降低了效率 不推荐使用;
*/
public static synchronized SingletonOne getInstance() {
// 判断当前实例是否被创建
if (instance == null) {
instance = new SingletonOne();
}
return instance;
}
}
饿汉式
优点:没有使用锁,保证了效率问题。
缺点:因为在类被加载时就创建对象,导致内存浪费。
/**
* 饿汉式
* 在类被加载时就创建对象,在调用getInstance()方法时,对象已经被创建好了,所以保证了线程全
*/
public class SingletonTwo {
/**
* 私有实例
*/
private static final SingletonTwo instance = new SingletonTwo();
/**
* 私有构造函数
*/
private SingletonTwo() {
}
/**
* 提供给外部的静态方法
*/
public static SingletonTwo getInstance() {
return instance;
}
}
双检锁式
多线程安全,且保证了性能
/**
* 双检索机制
* 在被调用时,首先判断是否被创建来提示效率,如果没有被创建在通过volatile关键字来保证线程可见,再通过synchronized锁来保证线程安全问题。
*/
public class SingletonThree {
/**
* 私有实例
*/
private volatile static SingletonThree instance;
/**
* 私有构造函数
*/
private SingletonThree() {
}
/**
* 提供给外部的静态方法
*/
public static synchronized SingletonThree getInstance() {
// 首先判断instance有没有被创建
if (instance == null) {
// 通过synchronized保证只有一个线程进入代码块
synchronized (SingletonThree.class) {
// 通过volatile关键字来保证其他线程是否已经创建了实例
if (instance == null) {
instance = new SingletonThree();
}
}
}
return instance;
}
}
以上为单例模式的基本描述,以及常见的几种实现方法,欢迎各位补充。