Java单列模式学习

一,为何要使用单列模式(引出单列模式)

有一些对象在应用系统中只应该出现一个实例,例如:处理日志的对象,线程池等等,如果出现多个,将会使程序产生异常,资源使用过量。

二,如何现实一个单列模式。

public class Singleton {
//第一步:在类中创建一个类本身的静态变量
private static Singleton singleton;
//第二步:将构造函数私有化
private Singleton(){ }
//第三步:提供统一的访问接口方法
public static Singleton getInstance(){
if(singleton == null)
{
singleton = new Singleton();//此种方式属于延迟实例化对象,真正用到时候,才实例化
}
return singleton;
}
public void showMsg(String name){
System.out.println(singleton.toString() + " 你好," + name);
}
}

三,单列模式在多线程中出现的问题,怎么解决。

问题:当有多个线程同时执行singleton = new Singleton()代码时,可能出现创建多个实例的情况。

解决方式如下:

1,使用synchronized关键字修饰公共访问方法来解决,但是此种方法降低系统的性能,如果不考虑性能问题,可以采用此种方式去处理。

public static synchronized Singleton getInstance(){
if(singleton == null)
{
singleton = new Singleton();
}
return singleton;
}

2,采用“急切”方式去实例化对象。

public class Singleton {
//第一步:在类中创建一个类本身的静态变量
private static Singleton singleton = new Singleton();//急切方式实例化对象
//第二步:将构造函数私有化
private Singleton(){

}
//第三步:提供统一的访问接口方法
public static Singleton getInstance(){
return singleton;
}

public void showMsg(String name){
System.out.println(singleton.toString() + " 你好," + name);
}
}

3,采用“双重检查加锁”,在getInstance中减少同步。(此种方式本人不是特别理解)

public class Singleton {
//第一步:在类中创建一个类本身的静态变量
private volatile static Singleton singleton;
//第二步:将构造函数私有化
private Singleton(){ }
//第三步:提供统一的访问接口方法
public static Singleton getInstance(){
if(singleton == null){
synchronized (Singleton.class) {
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
public void showMsg(String name){
System.out.println(singleton.toString() + " 你好," + name);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值