首先,啥是单例模式嘞?单例模式就是:确保一个类只有一个实例,并提供一个全局访问点。(这个定义出自《Head First设计模式》这本书说的是“单件模式”其实都一样啦~)想知道具体啥定义就自行解决吧。。。直接上代码。
一般的(经典)单例模式:
public class Singleton {
//静态变量记录Singleton类的唯一实例
private static Singleton uniqueInstance;
//构造器声明为私有,只有Singleton类内才能调用
private Singleton(){
}
//getInstance()实例化对象,并返回实例
public static Singleton getInstance(){
if(uniqueInstance==null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
//这里可以添加其他方法,我们随意添加一个打印方法
public void print(){
System.out.println("程序_小白!");
}
}
当出现多线程时:
1.使用关键字synchronized
package test;
/**
* 单例模式模板
* @author 程序_小白
*
*/
public class Singleton {
//静态变量记录Singleton类的唯一实例
private static Singleton uniqueInstance;
//构造器声明为私有,只有Singleton类内才能调用
private Singleton(){
}
//getInstance()实例化对象,并返回实例
//synchronized:在每个线程进入getInstance()之前要其他线程离开,不会出现两个线程同时进入这个方法
public static synchronized Singleton getInstance(){
if(uniqueInstance==null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
//这里可以添加其他方法,我们随意添加一个打印方法
public void print(){
System.out.println("程序_小白!");
}
}
注:这样可以解决问题,但是同步会降低程序性能,如果getInstance()在程序频繁运行的地方,是不妥的。
我们可以使用下面的方法。
2.在静态初始化时创建单例:
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
//构造器声明为私有,只有Singleton类内才能调用
private Singleton(){
}
public static Singleton getInstance(){
return uniqueInstance;
}
//这里可以添加其他方法,我们随意添加一个打印方法
public void print(){
System.out.println("程序_小白!");
}
}
3.“双重检查加锁”
public class Singleton {
private volatile static Singleton uniqueInstance;
//构造器声明为私有,只有Singleton类内才能调用
private Singleton(){
}
public static Singleton getInstance(){
//只有第一次才执行这一块代码
if(uniqueInstance==null){
synchronized (Singleton.class){
if(uniqueInstance==null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
//这里可以添加其他方法,我们随意添加一个打印方法
public void print(){
System.out.println("程序_小白!");
}
}
看上去很吊的样子,这样不仅提高了程序的性能,还能体现出高逼格。但是很不幸的是,在1.4以及更早的Java版本中,许多JVM对volatile 的实现导致双重检查加锁失败。
好吧,就这样,以上仅供参考。