Singleton设计模式之java

今天看了陈皓关于Singleton设计模式的解说感触颇深,下面我就关于看完了那篇博文之后Singleton设计模式我的看法。
单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了。这个设计模式主要目的是想在整个系统中只能出现一个类的实例。下面我们就程序说话。
public class Singleton {
private static Singleton singleton;

private Singleton() {
}

public static Singleton getInstence() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
[b]我们看这个程序确实实现了单例模式,但是我们有没有想过要是在多线程中的话呢,虽然在多线程中出现问题的可能性非常小[/b],但是作为一个严谨程序员我们必须应该考虑到,那么该怎么解决呢。于是就有了下面的程序:
public class Singleton {
private static Singleton singleton;

private Singleton() {
}

public static Singleton getInstence() {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
return singleton;
}
}
这确实考虑考到了线程的问题,[b]我们本来只是想让new这个操作并行就可以了,现在,只要是进入getInstance()的线程都得同步啊,注意,创建对象的动作只有一次,后面的动作全是读取那个成员变量,这些读取的动作不需要线程同步啊。这样的作法感觉非常极端啊,为了一个初始化的创建动作,居然让我们达上了所有的读操作,严重影响后续的性能啊![/b]
所以进一步改进:
public class Singleton
{
private static final Singleton singleton;

private Singleton()
{
}
public static Singleton getInstance()
{
if (singleton==null)
{
synchronized (Singleton.class)
{
if (singleton== null)
{
singleton= new Singleton();
}
}
}
return singleton;
}
}
上面只是表面的分析单例,实际上单例模式远比这复杂多,还有各种情况,比如类加载器啊,等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值