首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java单例模式优化写法

转载自 http://blog.csdn.net/diweikang/article/details/51354982 Java单例模式优化写法 方法一:推荐 [java] view plain...SingletonClassInstance.instance;     }   private SingletonClass() {     }   }   实际情况是,单例模式使用内部类来维护单例的实现...同时该方法也只会在第一次调用的时候使用互斥机制,这样就解决了低性能问题 在这一版本的单例模式实现代码中,我们使用了Java的静态内部类。这一技术是被JVM明确说明了的,因此不存在任何二义性。...方法二: [java] view plain copy public class SingletonTest {     private static SingletonTest instance...null) {                 syncInit();             }     return instance;         }     }   方法三: [java

25220

Java 单例的五种写法

Java的单例想必不会陌生,今天来总结下单例的各种不同写法和他们的应用。 什么是单例 单例的目的是为了保证某个类只实例化一个对象。...对于我们来说,理解这些单例写法的不同点,最好的方法是明白他们在什么情况下会失效。 也就是说,我们要找能"破坏单例"的情况,这样可以帮助我们知道在什么情况下用什么单例。...you want } } 枚举单例其实是利用了Java的特性,在Java中,任何的枚举都只会被实例化一次,虽然这样保证了绝对的单例,但是失去了懒加载的特性。...所以在部分需要考虑资源消耗而使用懒加载的场景下,就不适合用枚举单例了。 总结 单例的写法可以总结为以上五种,他们各有优缺点,而且除了枚举之外,其他的四种写法在使用反射的情况下都是可以被破坏的。...不仅反射,其实如果单例类实现了序列化接口的话,在序列化/反序列化场景下,也会破坏单例。 因此可以说,枚举是绝对安全的单例写法,骚是骚了些,但是这种写法比较陌生。

43510
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java中的6种单例写法

    在java中,单例有很多种写法,面试时,手写代码环节,除了写算法题,有时候也会让手写单例模式,这里记录一下单例的几种写法和优缺点。...1.初级写法 2.加锁 3.饿汉式 4.懒汉式 5.双锁检验 6.内部类 1.初级写法 package com.java4all.test6; /** * Author: yunqing * Date...2.加锁 我们优化上面的代码,遇到并发,很容易想到加锁,把获取对象的方法加上关键字synchronized,很巧,这种写法也称为懒汉式单例 ,如下: package com.java4all.test6...package com.java4all.test6; /** * Author: yunqing * Date: 2018/8/13 * Description:饿汉式单例模式--类初始化时就自行实例化...package com.java4all.test6; /** * Author: yunqing * Date: 2018/8/13 * Description:懒汉式单例模式 * 第一次调用时实例化

    57420

    单例模式 java 三种写法_双重锁的单例模式

    单例模式有多种写法,都有各自的优缺点,最常见的优缺点就是【懒汉和饿汉】的比较,以及是否线程安全 懒汉模式,节约内存,只有使用到时才创建单例对象,可能会有线程安全问题 饿汉模式,浪费内存,但可以由JVM类加载器去保证线程安全...一、饿汉模式 public class Singleton1 { /** * 饿汉式提前创建好单例对象(在类被主动使用时便会触发静态变量的初始化) */ private final...INSTANCE = null; /** * 禁止外部实例化 */ private Singleton2() { } /** * 当调用getInstance方法获取单例对象时再创建单例对象...JVM去实例化的保证线程安全,所以这种模式也是线程安全的懒汉模式 */ static class Holder { /** * 静态内部类里持有一个Singleton4的单例对象...{ /** * 单例对象,枚举实现单例,写法就很简单了,并且能保证线程安全(枚举类是由JVM加载),但枚举是饿汉模式 */ INSTANCE; /** * 提供一个获取枚举对象的方法

    49310

    Java单例模式的写法及优缺点

    总结下Java单例模式的几种写法: 1.饿汉式 public class Singleton { private static Singleton instance = new Singleton...DCL虽然在一定程度解决了资源的消耗和多余的同步,线程安全等问题,但是他还是在某些情况会出现失效的问题,**也就是DCL失效,在《Java并发编程实践》一书建议用静态内部类单例模式来替代DCL。...但是很遗憾,根据Java的语言规范,上面的代码是不可靠的。...,只有第一次调用getInstance方法时虚拟机加载SingletonHolder 并初始化单例 ,这样不仅能确保线程安全也能保证Singleton类实例的唯一性,所以推荐使用静态内部类单例模式。...总结 上述讲的其他几种单例模式实现中,有一种情况下他们会重新创建对象,那就是反序列化,将一个单例实例对象写到磁盘再读回来,从而获得了一个实例。

    79020

    单例模式的正确写法

    单例模式可能是代码最少的模式了,但是少不一定意味着简单,想要用好、用对单例模式,还真得费一番脑筋。本文对Java中常见的单例模式写法做了一个总结,如有错漏之处,恳请读者指正。...如此即可从语义上保证这种单例模式写法是线程安全的。注意,这里说的是语义上,实际使用中还是存在小坑的,会在后文写到。...所以,在jdk1.5版本前,双重检查锁形式的单例模式是无法保证线程安全的。 静态内部类法 那么,有没有一种延时加载,并且能保证线程安全的简单写法呢?...因此,Effective Java推荐尽可能地使用枚举来实现单例。 总结 这篇文章发出去以后得到许多反馈,这让我受宠若惊,觉得应该再写一点小结。代码没有一劳永逸的写法,只有在特定条件下最合适的写法。...最后,不管采取何种方案,请时刻牢记单例的三大要点: 线程安全 延迟加载 序列化与反序列化安全 参考资料 《Effective Java(第二版)》 《深入理解Java虚拟机——JVM高级特性与最佳实践

    37410

    单例模式你会几种写法?

    一、单例模式概述 单例模式定义很简单:一个类中能创建一个实例,所以称之为单例! 那我们什么时候会用到单例模式呢?? 那我们想想既然一个类中只能创建一个实例了,那么可以说这是跟类的状态与对象无关的了。...学过Java Web的同学可能就知道: Servlet是单例的 Struts2是多例的 SpringMVC是单例的 那既然多例是频繁创建对象、需要管理对象的,那Struts2为什么要多例呢??...很多人没接触过单例模式的都不知道有这种写法,这种写法很优化也高效!...三、总结 总的来说单例模式写法有5种: 饿汉式 简单懒汉式(在方法加锁) DCL双重检测加锁(进阶懒汉式) 静态内部类实现懒汉式(最推荐写法) 枚举方式(最安全、简洁写法) 明天估计写的是工厂模式了,敬请期待哦...---Java设计模式(一)-单例模式

    47930

    单例模式的八种写法

    单例模式的八种写法 单例模式作为日常开发中最常用的设计模式之一,是最基础的设计模式,也是最需要熟练掌握的设计模式。单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。...饿汉模式 懒汉模式(线程不安全) 懒汉模式(线程安全) 双重检查模式(DCL) 静态内部类单例模式 枚举类单例模式 使用容器实现单例模式 CAS实现单例模式 饿汉模式 代码如下: public class...第二次检查单例对象是否为空,则是为了避免这种情况:此时单例对象为空,两个线程,A线程在第2步,B线程在第5步,A线程发现单例对象为空,紧接着B线程就完成了实例化,然后就会导致A线程又会走一次第5步的实例化过程...当线程B执行到5.3之后,5.2之前时,这时候线程A首次判断单例对象是否为空。这时候当然单例对象是不为空的,但是却不能使用,因为单例对象还没有被初始化呢。...这种方式是利用了Map的key唯一性来保证单例。 CAS实现单例模式 以上实现主要用到了两点来保证单例,一是JVM的类加载机制,另一个就是加锁了。那么有没有不加锁的线程安全的单例实现吗?

    57910

    单例模式的n种写法

    1.前言 写完这个题目,我感觉自己好像”孔乙己”啊,回字的四种写法要不要学啊~ 我们经常会用到单例模式,但是我对他一直没有一个统一的的认识,比如我清楚好多种单例的写法,但是每一种是怎么演化来的?...这块就没有那么清晰了,因此此文对单例模式进行一个总结,同时手撸一下代码加深理解. 2.介绍 单例模式,即某一个类在整个系统中有且仅有一个实例....public enum EnumSingleton { SINGLETON; } 在《Effective Java》最后推荐了这样一个写法,看起来简直简单的有点不可思议,那么它是怎么保证以上几点的呢...在 《Effctive Java》中,作者极力推荐枚举实现单例,甚至说了它是单例实现的最好写法. 虽然我还没有应用过枚举实现单例,但是很快我就会将它加进我的代码库里....总结 在单例实现中,我们需要注意以下三个问题: (重要)延迟加载,避免浪费. (重要)线程安全,避免多个实例. 序列化安全. 完。

    52420

    单例模式你会几种写法?

    一、单例模式概述 单例模式定义很简单:一个类中能创建一个实例,所以称之为单例! 那我们什么时候会用到单例模式呢?? 那我们想想既然一个类中只能创建一个实例了,那么可以说这是跟类的状态与对象无关的了。...学过Java Web的同学可能就知道: Servlet是单例的 Struts2是多例的 SpringMVC是单例的 那既然多例是频繁创建对象、需要管理对象的,那Struts2为什么要多例呢??...二、编写单例模式的代码 编写单例模式的代码其实很简单,就分了三步: 将构造函数私有化 在类的内部创建实例 提供获取唯一实例的方法 2.1饿汉式 根据上面的步骤,我们就可以轻松完成创建单例对象了。...很多人没接触过单例模式的都不知道有这种写法,这种写法很优化也高效! 参考资料: www.zhihu.com/question/35…----java 单例模式通过内部静态类的方式?...三、总结 总的来说单例模式写法有5种: 饿汉式 简单懒汉式(在方法加锁) DCL双重检测加锁(进阶懒汉式) 静态内部类实现懒汉式(最推荐写法) 枚举方式(最安全、简洁写法) 明天估计写的是工厂模式了,敬请期待哦

    38550

    单例设计模式的几种写法(java版本、超详细)

    简介 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。这篇博客很精彩哦,请一定要耐心看完哦 在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式。...基本思路 单例模式要求类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)。...单例的实现主要是通过以下两个步骤: 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例; 在该类内提供一个静态方法...注意事项 单例模式在多线程的应用场合下必须小心使用。...如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。

    25010

    单例模式(下)---聊一聊单例模式的几种写法

    在上一篇文章 单例模式(上)---如何优雅地保证线程安全问题中,我们采取了懒汉式写法来写我们的单例模式,并且重点讲解了懒汉式中线程安全的问题。这篇我们来讲讲单例模式中的其他几种写法。...不过就算我们保证了线程安全,这种写法还是无法保证存在唯一一个对象实例。因为别人还是可以通过反射的方式来创建一个新的对象。...采用静态内部类的写法 直接上代码 public class Singleton3 { //静态内部类 private static class LazyHolder{ private...: singleton.Singleton4.() at java.lang.Class.getConstructor0(Class.java:3082)at java.lang.Class.getDeclaredConstructor...(Class.java:2178)at singleton.Singleton4.main(Singleton4.java:12) 所以,这种枚举的方式可以说的用的最多的一种方式了,唯一的缺点就是对象一开始就被创建

    43220
    领券