php 懒汉式,设计模式之禅之单例模式!

单例模式:创建全局的唯一一个实例!

1、普通单例

public class Singleton{

private Singleton single =  null;

private Singleton(){

}

public Singleton getSingleton(){

if(null ==single ){

single = new Singleton();

}

return single;

}

} 此方法,及其不安全

2、饿汉式

public class Singleton{

private static Singleton single =  new Singleton();

private Singleton(){

}

public Singleton getSingleton(){

return single;

}

} 此方式在类加载的时候就创建了单例对象,由于类在加载的时候对其方法是没有什么影响和调用的,所以,设置一个公共方法直接返回实例!此方法是线程安全的,因为此类加载之后实例对象只初始化一次,并且有static修饰,也不会被GC回收,不管多少个线程调用,都只是一个实例!

3、懒汉式

public class Singleton{

private static Singleton single =  null;

private Singleton(){

}

public static Singleton getSingleton(){

if(null ==single ){

single = new Singleton();

}

return single;

}

}懒汉式只是在类加载的时候创建了一个引用,但是并没有创建对象,只有在用到getSingleton方法的时候才会去判断为null的时候去创建对象,在多线程情况下此方法也是不安全的,有可能会创建多个对象的情况!所以我们对懒汉式进行改进 同步锁的懒汉式

public class Singleton{

private static Singleton single =  null;

private Singleton(){

}

public static synchornized Singleton getSingleton(){

if(null ==single ){

single = new Singleton();

}

return single;

}

}我们在方法上加上了同步锁,此时单例是安全的,但是效率会下降,当一个线程进来的时候其他的线程就只能在外面等待,并不能做其他的事情,这就是阻塞是工作方式,于是我们就又对其进行改进,让他们先判断再进来

public class Singleton{

private static Singleton single =  null;

private Singleton(){

}

public static Singleton getSingleton(){

if(null ==single ){

synchornized (this){

single = new Singleton();

}

}

return single;

}

}这个方法我们优化了那些不是null的对象判断,不是null的时候直接返回对象,不在浪费时间进同步锁里面了!但是这就会又出现问题,我们的同步块儿里面的就又会出现问题,当两个线程同时判断是null的时候,这时候就可能创建两个对象了!所以我们就又对其改进,在同步块儿里面再进行一次判断

public class Singleton{

private static Singleton single =  null;

private Singleton(){

}

public static Singleton getSingleton(){

if(null ==single ){

synchornized (this){

if(null ==single ){

single = new Singleton();

}

}

}

return single;

}

}我们对这个单例进行double check,双检查,这样就会保证总会一个线程初始化了就不会在初始化对象了!但是这是对的吗?不对的,虚拟机在创建对象的时候会进行重排序,进而是性能更加优异!所以 single = new Singleton();这个句子会发生重排序,我们要用violate去修饰Singleton,具体的violate可以去看看我的violate关键字的意思!所以就变成了这样

public class Singleton{

private violate static Singleton single =  null;

private Singleton(){

}

public static Singleton getSingleton(){

if(null ==single ){

synchornized (this){

if(null ==single ){

single = new Singleton();

}

}

}

return single;

}

}

(待续)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值