设计模式-单例模式

作者在 2018-04-13 19:54:55 发布以下内容

首先,啥是单例模式嘞?单例模式就是:确保一个类只有一个实例,并提供一个全局访问点。(这个定义出自《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 的实现导致双重检查加锁失败。



好吧,就这样,以上仅供参考。


默认分类 | 阅读 1534 次
文章评论,共0条
游客请输入验证码
文章分类
最新评论