java单例设计模式_设计模式(Java随笔)—单例模式

单例模式(Singleton Pattern):5种创建型模式中的一种,有关单例模式的所有创建方法参考:Java单例模式——并非看起来那么简单(总结不易,感谢!),本文中,我只对开发中常用的两种(多线程)方法和Java特有的枚举法进行代码复写。

首先,还是贴一下单例的定义吧:

Ensure a class only has one instance,and provide a global point of access to it.

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

开发常见一:双重检验锁(jdk1.5以后使用关键字volatile才有意义)

使用volatile的原因(虽然没看懂,但贴上吧,万一以后就看懂了呢):Java中的指令重排优化。所谓指令重排优化是指在不改变原语义的情况下,通过调整指令的执行顺序让程序运行的更快。JVM中并没有规定编译器优化相关的内容,也就是说JVM可以自由的进行指令重排序的优化。关键就在于由于指令重排优化的存在,导致初始化Singleton和将对象地址赋给instance字段的顺序是不确定的。在某个线程创建单例对象时,在构造方法被调用之前,就为该对象分配了内存空间并将对象的字段设置为默认值。此时就可以将分配的内存地址赋值给instance字段了,然而该对象可能还没有初始化。若紧接着另外一个线程来调用getInstance,取到的就是状态不正确的对象,程序就会出错。 --------------------- 本文来自 viclee108 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/goodlixueyong/article/details/51935526?utm_source=copy

//1、双重检验锁 jdk1.5以后才能使用关键字volatile

class Singleton1{

private static volatile Singleton1 instance=null;

private Singleton1(){}

public static Singleton1 newInstance(){

if(instance==null){

synchronized (Singleton1.class) {

if(instance==null){

instance=new Singleton1();

}

}

}

return instance;

}

}

开发常见二:静态内部类

//2、静态内部类

class Singleton2{

private static class SingletonHolder{

public static Singleton2 instance=new Singleton2();

}

private Singleton2(){}

public static Singleton2 newInstance(){

return SingletonHolder.instance;

}

}

枚举实现单例:

//3、枚举

enum Singleton3{

instance;

public void method(){}

}

在已知的单例实现方法中,除了枚举法外,都有两个共同的缺点,我直接贴过来吧;

需要额外的工作来实现序列化,否则每次反序列化一个序列化的对象时都会创建一个新的实例。

可以使用反射强行调用私有构造器(如果要避免这种情况,可以修改构造器,让它在创建第二个实例的时候抛异常)。

而枚举类很好的解决了这两个问题,使用枚举除了线程安全和防止反射调用构造器之外,还提供了自动序列化机制,防止反序列化的时候创建新的对象。

双重校验锁和静态内部类的方式可以解决大部分问题,平时工作中使用的最多的也是这两种方式。枚举方式虽然很完美的解决了各种问题,但是这种写法多少让人感觉有些生疏。在没有特殊需求的情况下,使用双重校验锁和静态内部类的方式实现单例模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值