Java设计模式-单例模式

本文介绍了单例模式的概念及其三种实现方式:同步方法、静态初始化及双重检查加锁。同步方法虽然能解决多线程问题但可能降低性能;静态初始化则在类加载时创建实例;双重检查加锁结合了两者的优点。

第一篇博客,意义还是比较重大的 ,毕竟第一次就这么没了!!为什么会写单例模式嘞?!因为今天学的就是单例啊!好了,不开车,不扯淡,进入正文!

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



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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值