单列模式几种方法分析
来源:互联网 发布:c语言静态变量定义 编辑:程序博客网 时间:2024/06/15 21:19
方法一:懒汉式(懒汉式对于单线程而言,推荐使用,但是对于多线程,可能会出现 数据不同步,也可能会创建出好几个对象,因此不建议使用)
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
- 单列模式几种方法分析
- Java的几种单列模式
- 单列设计模式几种写法的比较
- 23种模式-单列模式
- Singleton_单列模式案例分析与详解
- 单列模式总结(结合Android源码分析)
- 单列设计模式,构造方法私有化
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- C++模板实现二叉树(六 AVL树基础与旋转)
- 欢迎使用CSDN-markdown编辑器
- 【Git】Git 和 SVN 之间的五个基本区别
- 开博寄语
- 优先级队列
- 单列模式几种方法分析
- Machine Learning第一讲[单变量线性回顾] --(三)线性代数知识复习(选学)
- 对链表数据进行插入排序
- 单列模式(Singleton Pattern、单态模式、单件模式、对象创建型模式)
- 浅解Java泛型
- 人月神话之第二章人月神话
- HTML学习3——表单标签,select标签,textarea标签,datalist标签,video标签
- 发奖金
- Bored Three-God NBUT 1228