概述
单例设计模式是Java工程中最常用,也是最简单的设计模式。其最核心特点便是采用单例设计模式的类只有一个实例,这样
的的好处就是整个工程可以节省了系统开销,不必每次调用的类的中的方法时都生成一个实例。同时,也有效避免了线程池、缓
存、硬件设备在调用多个实例时出现冲突的情况。而且,整个工程可以共享这个实例中的属性的值。
基本实现
pulic class SingleTon {
private static SingleTon mSingleTon; //静态、私有化实例
/**
*构造方法私有化
*/
private SingleTon(){
}
/**
*获取类的实例
*/
public static SingleTon getInstance(){
if(mSingleTon==null){
mSingleTon = new SingleTon();
}
return mSingleTon;
}
}
单例设计模式的基本实现代码如下所示。需要注意的是,实例应该是静态的、私有化的(也可以是public,但不安全)。
并且,要把构造方法进行封装,这样的话就不能从外部不能从外部进行实例化。
构建方法优化
上面的基本实现,又称为“懒汉模式”,这是一种线程不安全的创建方式。多个线程同时操作时,会有冲突或者有可能创建
出多个实例。下面介绍几种线程安全的创建方法。
1)加同步锁
pulic class SingleTon {
private static SingleTon mSingleTon; //静态、私有化实例
/**
*构造方法私有化
*/
private SingleTon(){
}
/**
*获取类的实例
*/
public static sychronized SingleTon getInstance(){
if(mSingleTon==null){
mSingleTon = new SingleTon();
}
return mSingleTon;
}
}
加上同步锁,就可以多个线程操作时也会只能创建一个实例对象,大大增加了线程安全性和效率。
2)双重同步锁
这个就更狠了,话不多说,代码如下。
pulic class SingleTon {
private static SingleTon mSingleTon; //静态、私有化实例
/**
*构造方法私有化
*/
private SingleTon(){
}
/**
*获取类的实例
*/
public static synchronized SingleTon getInstance(){
synchronized (SingleTon.class) {
if(mSingleTon==null){
mSingleTon = new SingleTon();
}
}
return mSingleTon;
}
}
3)“饿汉”创建方式
public class SingleTon {
private static SingleTon instance = null;
static {
instance = new SingleTon();
}
private SingleTon() {
}
public static SingleTon getInstance() {
return instance;
}
}
这种方式在类初始化的时候创建实例,即在第一次调用getInstance()方法之前就创建了实例。这种方式基于classloder
机制,也避免了线程同步的问题。