设计模式(一)—单例模式
2016-07-26 07:46
323 查看
一、概述
1.单例模式的优点
由于单例模式只生成一个实例,减少了系统性能的开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久助理内存的方式来解决。2.单例模式的实现方式
(1)饿汉式线程安全,调用效率高,不能延迟加载。
(2)懒汉式
线程安全,调用效率不高,可以延迟加载。
(3)静态内部类式
线程安全,调用效率高,可以延迟加载。
二、实现方式
1.饿汉式
饿汉式,static变量会在类装载时初始化,此时不会涉及多个线程多个线程对象访问该对象的问题。虚拟机保证只装载一次该类,肯定不会发生并发访问问题,因此可以省略sychronized关键字。/* * 懒汉式 * 特点: 线程安全,调用效率高,不能延迟加载。 */ public class Singleton{ //类初始化时立即加载,由于加载类时是线程安全的 private static Singleton instance = new Singleton(); private Singleton(){ } //方法没有同步,调用效率高 public static Singleton getInstance(){ return instance; } }
测试
@Test public void testS1(){ Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.println(s1 == s2);//true }
2.懒汉式
因为每次调用getInstance()方法都要同步,并发效率低。/* * 懒汉式 * 特点:线程安全,调用效率不高,可以延迟加载。 */ public class Singleton2{ private static Singleton2 instance; private Singleton2(){ } public static synchronized Singleton2 getInstance(){ if(instance == null){ instance = new Singleton2(); } return instance; } }
测试
@Test public void testS2(){ Singleton2 s1 = Singleton2.getInstance(); Singleton2 s2 = Singleton2.getInstance(); System.out.println(s1 == s2);//true }
3.静态内部类
/* * 静态内部类 */ public class Singleton3{ private Singleton3(){ } private static class SingletonInstance{ //保证内存在只有一个这样的实例 private static final Singleton3 instance = new Singleton3(); } public static Singleton3 getInstance(){ return SingletonInstance.instance; } }
测试
@Test public void testS3(){ Singleton3 s1 = Singleton3.getInstance(); Singleton3 s2 = Singleton3.getInstance(); System.out.println(s1 == s2);//true }
相关文章推荐
- 独家秘笈_block关键字的使用(通俗易懂+化繁为简)
- App Webview远程调试学习小记
- 关于静态变量,成员变量,静态方法,实例方法的用法及区别
- javascript中eval解析JSON字符串
- 除法
- Hygieia 部署指南(1)介绍篇
- Codevs 4600 [NOI2015]程序自动分析
- AOJ 0558 BFS
- Session入Redis
- python - 面向对象(二)
- Dialog、Toast、Snackbar,你真的了解它们吗?
- 内存映射原理
- 【强烈推荐】分享一下自己的超轻量级高性能O/R mapping数据访问组件Deft,比dapper快20%以上,比手写代码还要快
- 226. Invert Binary Tree
- AOJ 0033 DFS
- MarkWord
- mac Access denied for user 'root'@'localhost' (using password: YES)
- 225. Implement Stack using Queues
- PowerDesigner 在通过jdbc连接数据库时 Could not Initialize JavaVM!
- 添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)