1.定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供整个实例。
2.单例模式通用代码如下
第一种方式:饿汉式单例
public class Singleton {
private static final Singleton singleton=new Singleton();
//private构造函数确保了一个在一个应用中只产生了一个实例
//并且是自行实例化的(new Singleton())
private Singleton(){
}
public static Singleton getSingleton(){
return singleton;
}
//类中其他方法,尽量为static
}
第二种方式:懒汉式单例
package com.yy.singleton;
/**
*
* 单例模式:一个类只有一个实例,对外提供获取实例的方法
*
*/
public class Singleton {
private static Singleton instance = null;
private Singleton(){
}
/**
* 此种实现方式在多线程下失效
* @return
*/
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
/**
* 此种实现方式解决了多线程下单例失效问题,但是每次执行此方法时都会受到同步锁的限制,效率打了折扣
* @return
*/
public synchronized static Singleton getInstance1(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
/**
* 此种实现方式与上面的相同,只是把synchronized移到方法体内
* @return
*/
public static Singleton getInstance2(){
synchronized (Singleton.class) {
if(instance == null){
instance = new Singleton();
}
}
return instance;
}
/**
* 双重锁定(Double-Check Locking)
* 当instance不为空时,就不会进入synchronized代码块。
* 此种实现方式避免了每次调用都进行同步控制,只有instance在第一次构造时需要同步
* @return
*/
public static Singleton getInstance3(){
if(instance == null){
synchronized (Singleton.class) {
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
最后一种方法使用了双重锁机制,可以提高性能。