单列模式几种方法分析

5 篇文章 0 订阅
0 篇文章 0 订阅

方法一:懒汉式(懒汉式对于单线程而言,推荐使用,但是对于多线程,可能会出现 数据不同步,也可能会创建出好几个对象,因此不建议使用)

 

public class SingleModelTwo {
	/**
	 * volatile 内存可见性(直接写入主存)、指令重排序
	 * synchronized 实现代码的原子性  上下文切换 (耗时) 保证内存可见性
 	 */
	private static  SingleModelTwo singleModelTwo=null;
	private SingleModelTwo(){};
  /**
   * 线程不安全
   * @return
   */
	public static SingleModelTwo getInstance(){
		if(singleModelTwo==null){
			singleModelTwo=new SingleModelTwo();
		}
		return singleModelTwo;
	}
}

方法二:显示锁(由于在方法前边加了显示锁,因此在调用这个方法是,因此在多线程同时调用改方法时,它时一遍一遍执行,不能达到并发,效率低下

 

public class SingleModelTwo {
	
	private static  SingleModelTwo singleModelTwo=null;
	private SingleModelTwo(){};
 
	/**
	 * 线程安全 效率低下
	 * @return
	 */
	public static synchronized SingleModelTwo getInstanceTwo(){


		if(singleModelTwo==null){
			singleModelTwo=new SingleModelTwo();
		}
		return singleModelTwo;
	}

方法三:双重检验锁(它在判断singleModelTwo为空之后加了显示锁,当该方法第一次执行完成之后,singleModel已经不为空,因此再次调用时,显示锁代码不被调用,所以效率相对方法二有所提高,推荐使用

 

 

public class SingleModelTwo {

	private static  SingleModelTwo singleModelTwo=null;
	private SingleModelTwo(){};
  
	/**
	 * 线程安全  效率相对较低
	 * 双重检验锁
	 */
	 public  static SingleModelTwo getInstanceThree(){
		if (singleModelTwo==null)
	    synchronized (SingleModelTwo.class){
		if(singleModelTwo==null){
			singleModelTwo=new SingleModelTwo();
		         }
		}
		 return singleModelTwo;
	 }
}


方法四:饿汉式(它直接在类里边将对象实例化,速度快,这样在不加锁的情况下保证了线程安全,但是由于没有延缓机制,所以在多线程并发的情况下,可能会过度消耗JVM内存,使得运行效率变低。。。。。有时候在不使用改类对象时,而是用其他静态方法,这个时候实例化对象也是没有用的,只能增加JVM开销)

 

 

public class SingleModelOne {
    //饿汉式
    private static SingleModelOne singleModel=new SingleModelOne();
     /**
      * 构造器私有
      */
    private SingleModelOne(){};
    public static SingleModelOne getInstanceSingleModel(){
	  
	  return singleModel;
  }
	
}

方法五:静态内部类( 它是在饿汉式基础之上,增加静态内部类是现实延迟加载,保证JVM内存不被过度消耗,速度快, 推荐使用)

 

 

public class SingleModelThree {
	/**
	 * 静态内部类
	 * @return
	 */
	public static SingleModelThree getInstance(){
		return GetSingle.modelThree;
	}
    private SingleModelThree(){}
	public static class GetSingle{
		private static final SingleModelThree modelThree=new SingleModelThree();
	}
}

 

注:最后在提一点,在网上看到有用枚举的,但是我觉得不是很常用,在此也没有做过多研究。

        静态方法以及静态变量都是在类加载时被一起加载的,所以说有时候你用类对象第一次去调用静态方法,其他静态方法也会被加载

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值