设计模式之单例模式
简介
Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。
单例模式能够保证一个类仅有唯一的实例,并提供一个全局访问点。单例模式主要有3个特点:
- 单例类确保自己只有一个实例。
- 单例类必须自己创建自己的实例。
- 单例类必须为其他对象提供唯一的实例。
代码实现
- 饿汉式
public class Single {
/**
* 成员变量id
*/
private int id;
/**
* 成员变量name
*/
private String name;
/**
* 初始化时,会立即加载该对象,线程天生安全,调用效率高
*/
private static Single instance = new Single();
/**
* 关键:私有构造方法
* 只允许在内部实例化类
*/
private Single(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 获取静态的实例
*/
public static Single getInstance() {
return instance;
}
}
懒汉式
懒汉式单例模式存在多线程并发时候的问题。普通的加锁方式并不能保证创建的类实例唯一,通过使用双重检查锁定是的多线程并发时候不会创建额外的实例。
public class Single {
/**
* 成员变量id
*/
private int id;
/**
* 成员变量name
*/
private String name;
/**
* 静态变量:实例
*/
private static Single instance = null;
private Single() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Single getInstance() {
// 第一次判断
if (instance == null) {
// 加锁
synchronized (Single.class) {
// 第二次判断
if (instance == null) {
instance = new Single();
}
}
}
return instance;
}
}
总结
单例模式最重要的就是使用私有的构造方法,外部不能创建该类的实例,类的实例通过自己内部创建。饿汉式单例类在类被加载时就将自己实例化,它的优点在于无须考虑多线程访问问题,可以确保实例的唯一性。懒汉式单例模式由于存在多线程上的问题,使用双重检查锁定等机制进行控制,这将导致系统性能受到一定影响。