设计模式 - java代码实现单例模式
2018-02-07 21:28
477 查看
常见的单例模式的实现有五种,其中一种是饿汉式,四种是懒汉式。
1.饿汉式:不存在线程安全问题。但不管使不使都会占用内存空间,造成内存利用率降低。package com.zx.singleton; public class Singleton1 { private Singleton1(){}; private static Singleton1 instance=new Singleton1(); public static Singleton1 getInstance(){ return instance; } }
2.懒汉式的第一种:最简单,存在线程安全问题,不使用。
package com.zx.singleton; public class Singleton2 { private Singleton2(){}; private static Singleton2 instance; public static Singleton2 getInstance(){ if(instance==null){ instance=new Singleton2(); } return instance; } }
3.懒汉式的第二种:解决了线程安全问题。其中volatile防止重排序,Sychroniezd加锁。但存在的问题是Sychroniezd加在整个方法上导致运行效率较低。
package com.zx.singleton; public class Singleton3 { private Singleton3(){}; private static volatile Singleton3 instance; public static synchronized Singleton3 getInstance(){ if(instance==null){ instance=new Singleton3(); } return instance; } }
4.懒汉式的第三种:不存在线程安全问题。解决了上一种的问题。存在的问题就是加锁降低效率。
package com.zx.singleton; public class Singleton4 { private Singleton4(){}; private static volatile Singleton4 instance; public static Singleton4 getInstance(){ if(instance==null){ synchronized (Singleton4.class) { if(instance==null){ instance=new Singleton4(); } } } return instance; } }
懒汉式的第四种:使用静态内部类,解决线程安全问题,同时不使用锁提高效率。
内部类时延时加载的,也就是在第一次使用时才加载,不使用就不加载,所以可以很好的实现懒汉式单例模式。
package com.zx.singleton; public class Singleton5 { private Singleton5(){}; private static class Sub{ private final static Singleton5 instance=new Singleton5(); } public static Singleton5 getInstance(){ return Sub.instance; } }
单例虽小,五脏俱全。
相关文章推荐
- 详解Java设计模式中的生产-消费者模式及代码实现
- [置顶] java面试题:java中的单例设计模式及两种实现方法的代码举例
- 设计模式之一(代码用java实现)
- 设计模式之迭代器模式java实现代码
- C++实现w3cshool设计模式教程--设计模式中的Java代码
- 设计模式----单例模式UML图和代码实现(C#&JAVA)
- Java设计模式之代理模式原理及实现代码分享
- 设计模式之迭代器模式java实现代码
- 设计模式学习笔记以及java代码实现
- 设计模式之迭代器模式java实现代码
- 模板设计模式,简单Java代码实现
- 设计模式之动态代理的代码实现(Java)
- 23种经典设计模式的java实现_5_职责链模式
- 用Java实现的设计模式-Factory
- 关于抽象工厂实现数据库查询的设计(JAVA代码实现)
- JAVA23种设计模式实现
- Jsp/Java代码分离.实现页面真正的代码分离 设计原理
- GoF设计模式学习之一:单例模式(Java实现)
- 追MM与设计模式的JAVA实现-简单工厂方法
- 设计模式:用Java动态代理实现AOP