关于单例模式的设计无非是尽量要实现三种特点:
①线程安全;
②调用效率高;
③实现延迟加载(真正用到的时候才去加载)。
对此kk目前总结了前辈们设计懒汉式、饿汉式、静态内部类实现式三种方式。
(1).懒汉式1.0:
public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } }
懒汉式1.0具有延迟加载以及调用效率高的特点,但是不具备线程安全的特点。因为一旦并发访问,如果线程A、B同时进入if代码块,A做完new初始化对象并返回instance后,B再做new初始化对象,这样就不能保证单例对象的唯一性。
由此延伸出懒汉式2.0:
public class Singleton { private static Singleton s; private Singleton() {} public static synchronized Singleton getInstance() { if(s == null) { s = new Singleton(); } return s; } }
懒汉式2.0解决了懒汉式1.0的线程不安全问题,但是不具备调用效率高的特点。因为每一个线程调用getInstace()时都会进行synchronized的判断。
由此延伸出懒汉式3.0:
public class Singleton { private static Singleton s; private Singleton() {} private static Object syn = new Object(); public static Singleton getInstance() { if(s== null) { synchronized (syn) { if(s == null) { s= new Singleton(); } } } return s; } }
懒汉式3.0解决了懒汉式1.0线程不安全的问题,同时也解决了懒汉式2.0调用效率不高的问题。
解决线程不安全问题:因为当线程A、B同时进入第一个if语句块的时,A、B只能有一个进入sychronized代码块(另一个在外排队等候),当第一个线程结束后s变量已经被初始化,当另外一个进入sychronized代码块,此时进行第二重if判断s不为null,返回第一个线程创建的对象,保证了线程安全;
解决调用效率不高的问题:因为只是在对象未初始化时才会有synchronized判断,调高了调用效率。
(2).饿汉式
public class Singleton1 { //加载类时进行初始化,天然的线程安全,这里的s只有一份 private static Singleton1 s = new Singleton1(); private Singleton1() {} //方法没有同步调用效率高 public static Singleton1 getInstance() { return s; } }
饿汉式具有线程安全以及调用效率高的特点,但是缺少了延迟加载的特性。因为类加载是就会对instance进行初始化。
(3).静态内部类式
public class Singleton { private static class SingletonToGetInstance { private static Singleton instance = new Singleton(); } private Singleton() {} public static Singleton getInstance() { return SingletonToGetInstance.instance; } }
相关推荐
设计模式——单例 例子和一些ppt 看下没错的
NULL 博文链接:https://794950040.iteye.com/blog/2208104
C++设计模式——单例模式-附件资源
单例的5中实现及反射和反序列化破解单例。
今天给大家带来的是23种设计模式的第一种——单例模式。前天写的第一篇文章设计模式的七大原则,是我第一次写文章,目前看了浏览量,让我信心大增。文章有什么讲述方式不对的欢迎大家随时给我私信。24小时恭候!!...
对应博客讲解:http://blog.csdn.net/t1234xy4/article/details/52419546
单例模式源代码 博文链接:https://yangguangfu.iteye.com/blog/815944
单例模式设计。
1)程序功能:单例模式设计Memcache和Redis操作类,采用PHP编写。 2)程序详解地址:http://blog.csdn.net/clevercode/article/details/46410055。 3)原创作品,出自"CleverCode的博客",分类为《设计模式之PHP项目...
本篇文章主要介绍了android开发设计模式之——单例模式详解,具有一定的参考价值,有需要的可以了解一下。
NULL 博文链接:https://maidoudao.iteye.com/blog/1329564
单例模式的实现饿汉式懒汉式线程安全的懒汉式登记式单例模式的优缺点单例模式的优点单例模式的缺点 单例模式是23个模式中比较简单的模式,应用也非常广泛 什么是单例模式? 单例模式的定义: Ensure a class ...
我们经常遇到这样的场景,线程A和线程B对同一个对象执行操作,但是在A里面new了后,B里面不便取,使的A,B对象是同一个对象,我们就会使用单例模式了。在Android中我们常用于数据库操作,蓝牙命令控制,以及一些工具...
首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一反应应该是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有...
最近在设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的...首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类)
单例模式大家并不陌生,也都知道它分为什么懒汉式、饿汉式之类的。但是你对单例模式的理解足够透彻吗?今天我带大家一起来看看我眼中的单例,可能会跟你的认识有所不同。很容易看出,上面这段代码在多线程的情况下是...