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

设计模式正确写法(双重校验,静态内部类,枚举)

设计模式是一种常用软件设计模式。核心结构只包含一个被称为特殊类。通过模式可以保证系统系统中一个类只有一个实例。...属于创建型模式 特点: 模式类只有一个实例(对象) 模式类必须自己创建自己唯一实例 模式类必须给所有其他对象提供这一实例 2.1 懒汉式 普通懒汉式由于懒加载所以存在线程安全问题,这里给出有一种双重检查实现方式...(){ reuturn LazyHolder.INSTANCE; } } 注意事项: 从外部无法访问静态内部类LazyHolder,只有当调用Singleton.getInstance...方法时候,才能得到该对象 INSTANCE对象初始化时机并不是类Singleton被加载时候,只有当调用getInstance方法,使得静态内部类LazyHolder被加载时候。...因为这种方式是利用classLoader加载机制来实现懒加载,并保证构建线程安全。

40520

JAVA模式分析(doublecheck和枚举实现)

文章目录 1.饿汉模式 2.懒汉模式 3.更好解决办法 java模式实现方法有如下几种: 1.饿汉模式 所为饿汉模式,即一开始就创建一个静态对象,之后该对象一直存在。...但是存在一个问题就是 instance 只要 Singleton1被加载就会被创建到static所在静态方法区。...上述方法比较冗繁,有没有更好解决办法呢,有幸阅读过《effective java》这本书对于有更好解决办法。...这种方法很巧妙地利用一个内部类,很简单代码即实现了,而且是线程安全。 方式二:《effective java》还有一种更简单写法,那就是枚举。...枚举天然实现了模式。

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

「源码分析」— 为什么枚举模式最佳方法

关于其用法之一,便是模式,并且《Effective Java》中有被提到: 单元素枚举类型已经成为实现 Singleton 最佳方法 本文便是探究 “为什么枚举模式最佳方法?”。...本文内容概要如下: 回顾常见模式方法; 探索 Java 枚举是如何防止两种攻击; 若不使用枚举,又如何防止两种攻击。 2....防止反射攻击 从第 2 节列举常用模式方法,可看出这些方法具有共同点之一是私有的构造函数。这是为了防止该类外部直接调用构建函数创建对象了。...综上所述,可知枚举类型 Java 中天生就不惧怕反射和反序列化攻击,这是由 Java 自身提供逻辑保证。那第 2 节中所提及模式方法,是否也有办法能防止反射和反序列攻击?...5.非枚举防守方法 本节以懒汉式为,其他模式方法同样适用。

1.2K60

Spark 实现模式技巧

模式是一种常用设计模式,但是集群模式下 Spark 中使用模式会引发一些错误。我们用下面代码作例子,解读在 Spark 中使用模式遇到问题。... Stackoverflow 上,有不少人也碰到这个错误,比如 问题1、问题2和问题3。 这是由什么原因导致呢?...Spark 执行算子之前,会将算子需要东西准备好并打包(这就是闭包概念),分发到不同 executor,但这里不包括类。类存在 jar 包,随着 jar 包分发到不同 executors 。...当不同 executors 执行算子需要类时,直接从分发 jar 包取得。这时候 driver 上对类静态变量进行改变,并不能影响 executors 类。...这时候不同 executors Example.getInstance().name 等于 “default_name”。

2.3K50

【说站】java模式Holder是什么

java模式Holder是什么 区别 1、声明类,成员变量不声明实例变量,而是放置静态内部类。这种方法类似于懒汉。他们都采用类装载机制,以确保初始化实例只有一个线程。...不同是,Holder单个模式是将实例初始化放入静态类别从而实现懒加载。 Holder模式核心还是静态变量,足够方便,线程安全;通过静态Holder类持有真实例子,间接实现懒惰载入。...实例 public class Singleton {       /**        * 类级内部类,也就是静态成员式内部类,该内部类实例与外部类实例        * 没有绑定关系,而且只有被调用到才会装载...      */      private Singleton(){      }      public static  Singleton getInstance(){          return... SingletonHolder.instance;      }  } 以上就是java模式Holder介绍,希望对大家有所帮助。

85830

Java模式不同写法(懒汉式、饿汉式、双检锁、静态内部类、枚举

目录 1、饿汉模式 2、懒汉模式 3、双重校验锁【推荐】 4、静态内部类【推荐】 5、枚举 6、模式线程安全性 ---- Java(Singleton)模式是一种广泛使用设计模式。...它其实是一个用来创建线程安全方法,当实例第一次被创建时它试图用单个锁进行性能优化, 但是由于太过于复杂JDK1.4它是失败,我个人也不喜欢它。...下面我们来看看是如何被保证: 首先,枚举我们明确了构造方法限制为私有,我们访问枚举实例时会执行构造方法。...同时每个枚举实例都是static final类型,也就表明只能被实例化一次。调用构造方法时,我们被实例化。...模式有很多种写法,我总结一下: (1)饿汉式:线程安全 (2)懒汉式:非线程安全 (3)双检锁:线程安全 (4)静态内部类:线程安全 (5)枚举:线程安全 如何选择 如果我们程序启动后

67930

Java设计模式(1)模式

前言 软件开发世界里,设计模式如同一本精妙编码诗集,已经成为一种标准编程实践。Java编程,设计模式很重要。...本文是这个系列第一篇章,我们将讲解一下模式实现方式、应用场景以及它用途模式 模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点供外部代码获取该实例。...if (instance == null) instance = new Singleton(); return instance; } } 要想懒汉式能够多线程很好工作...因为SingletonHolder是一个静态内部类,它包含一个静态INSTANCE成员变量,用于存储对象。第一次调用getInstance方法时,静态内部类会被加载,从而创建对象。...这种方式用比较少,但这是实现模式最佳方法,它更简洁,自动支持序列化机制,绝对防止多次实例化。

13110

设计模式游戏开发应用之模式

模式 1.通俗定义 是指在运行只有一个实例对象存在。 2.结构图如下(图片来源与网络) ?...3.游戏开发使用 游戏开发模式使用也是非常普遍,比如在Cocos2d-xDirector就是一个。比如游戏中很多工具类都是做成单或者静态方式来使用。...还有一种写法,很少有人使用,然而这种写法在做游戏开发时却很好用。比如,我们需要分享时,往往都需要每个平台都有单独功能和实现方式,很多时候我们都这么写: ? 然后再根据不同平台调用不同函数。...很多项目中我们都能看见这样类:SoundManager,GameManager,DataUtils等等,各种各样Manager和Utils,大多数时候它们很管用,但是当你要创建这么一个类时候,你应该思考一下真的需要一个类么...《游戏编程模式》中有下面这个例子: ? 这里BulletManager就是一个管理Bullet类,看起来这里很合理,但是真的需要吗?答案是不需要: ?

89130

解决模式懒汉式不支持高并发,饿汉式不支持懒加载问题最简单方法——基于枚举类型实现

一、前言 解决模式懒汉式不支持高并发,饿汉式不支持懒加载问题,确实很多小编也是写过---> DCL(Double Check Lock双重检锁机制)解决模式懒汉式不支持高并发,饿汉式不支持懒加载问题...静态内部类解决模式懒汉式不支持高并发,饿汉式不支持懒加载问题 大家都可以看一下。...二、代码实现 - 模式对象 import java.util.concurrent.atomic.AtomicInteger; public class Single { private...,基于枚举类型实现。...这种实现方式通过 Java 枚举类型本身特性,保证了实例创建线程安全性和实例唯一性。比较推荐使用 Q.E.D.

33110

写了这么久代码,你懂模式吗?

面试时候,问到许多年轻开发他所会设计模式是什么,基本上都会提到模式,但是对模式也是一知半解,开发我们经常会运用模式,所以我们还是要更了解模式才对。...方法对singleton进行了两次判空,第一次是为了不必要同步,第二次是singleton等于null情况下才创建实例。...DCL虽然一定程度解决了资源消耗和多余同步,线程安全等问题,但是他还是某些情况会出现失效问题,也就是DCL失效,《java并发编程实践》一书建议用静态内部类模式来替代DCL。 5....方法时虚拟机加载SingletonHolder 并初始化sInstance ,这样不仅能确保线程安全也能保证Singleton类唯一性,所以推荐使用静态内部类模式。...在上述几个方法示例如果要杜绝对象被反序列化是重新生成对象,就必须加入如下方法: private Object readResolve() throws ObjectStreamException

32910

图图细谈设计模式——模式

其实最简单是工厂模式而不是(工厂后续会说) 设计模式是一种思想,最早用于建筑,后来也用到我们软件开发上来,是牛人总结一些常见架构思想,按照六原则设计出来23设计模式 模式:是23设计模式稍简单设计模式...:高效(不用同步锁) 线程安全(静态类属性) 懒加载(使用时我才创建) ---- package org.huey.pattern.singleton1; /** * 枚举类型模式 * @author...huey * */ public enum EnumStyle { //枚举天然是,jvm底层实现,不过用枚举实现,要求只有这一个对象 INSTANCE; //INSTANCE...其枚举类型 优点 线程安全,高效, 缺点是 没有延迟加载(可通过反编译代码看出),还有就是只有这种方式,可以避免反射(不考虑特殊处理)和反序列化漏洞,其他形式模式做不到这一点,换句话说反射和反编译能破解其他形式模式...注: 一般用途就是用在他功能,只加载一次就够。

32831

Java 以及所引发思考

2 正文 Java 中常见几类: 饿汉式 双重检查锁 静态内部类 枚举 我们来逐个分解: 3 饿汉式 public class Singleton { private...() { return instance; } } 饿汉式 instance 初始化是类加载时进行,而类加载是由 ClassLoader 来完成,这个过程由 JVM 来保证同步...禁止指令重排:双重检查锁利用就是这一点。 那什么是指令重排呢?指令重排是指计算机为了提高执行效率,会做一些优化,不影响最终结果情况下,可能会对一些语句执行顺序进行调整。...中被使用,所以它被加载时机也就是 getInstance() 方法第一次被调用时候。...因此,Effective Java 推荐尽可能地使用单元素枚举来实现。 8 一些个人思考 枚举是如何防止反射攻击呢? 我们得从枚举实现去考虑。

70670

23天读懂23种设计模式:模式(创建型)

工厂方法模式(Factory Pattern):工厂方法模式,工厂类成为了抽象类,实际创建工作将由其具体子类来完成。...模式是什么 模式(Singleton Pattern)可以说是整个设计中最简单模式之一,且这种模式即使没有看设计模式相关资料也经常在编码开发。...综上以及我们平常开发,可以总结一条经验,模式主要解决是,一个全局使用类频繁创建和消费,从而提升提升整体代码性能。...饿汉模式(线程安全) 饿汉式模式特点是:类加载时就直接初始化了实例。即使没用到,也会实例化,因此,它也是线程安全模式。...SingletonCase3 getInstance(){ return singleton; } } 懒汉模式(加锁&线程安全) 懒汉式模式特点:对比普通模式,给方法加了排它锁,这是线程安全写法

18410

Java并发编程(3)- 如何安全发布对象

所以本小节我们将看看如何安全发布对象,想要安全发布对象主要有四种方法静态初始化函数初始化一个对象引用 将对象引用保存到volatile类型域或者AtomicReference对象 将对象引用保存到某个正确构造对象...final类型域中 将对象引用保存到一个由锁保护域中 以上所提到几种方法都可以应用到模式,所以本文将以模式为,介绍如何安全发布对象,以及实现一些问题。...: 从外部无法访问静态内部类LazyHolder,只有当调用Singleton.getInstance方法时候,才能得到对象INSTANCE。...INSTANCE对象初始化时机并不是类Singleton被加载时候,而是调用getInstance方法,使得静态内部类LazyHolder被加载时候。...这里之所以使用内部枚举原因是为了让这个对象可以懒加载,相当于是结合了静态内部类实现思想。若不使用内部枚举类的话,对象就会在枚举类被加载时候被构建。 ---- 模式实现总结: ?

55420

漫画:什么是模式?(整合版)

private static Singleton instance = null; //对象 //静态工厂方法 public static Singleton getInstance...3.getInstance是获取对象方法。 如果初始值是null,还未构建,则构建对象并返回。这个写法属于模式当中懒汉模式。...Singleton instance = null; //对象 //静态工厂方法 public static Singleton getInstance() { if...2.INSTANCE对象初始化时机并不是类Singleton被加载时候,而是调用getInstance方法,使得静态内部类LazyHolder被加载时候。...2.使用枚举实现模式,不但可以防止利用反射强行构建对象,而且可以枚举类对象被反序列化时候,保证反序列返回结果是同一对象。

41130

漫画:什么是模式?(整合版)

static Singleton instance = null; //对象 //静态工厂方法 public static Singleton getInstance() {...3.getInstance是获取对象方法。 如果初始值是null,还未构建,则构建对象并返回。这个写法属于模式当中懒汉模式。...Singleton instance = null; //对象 //静态工厂方法 public static Singleton getInstance() { if...2.INSTANCE对象初始化时机并不是类Singleton被加载时候,而是调用getInstance方法,使得静态内部类LazyHolder被加载时候。...2.使用枚举实现模式,不但可以防止利用反射强行构建对象,而且可以枚举类对象被反序列化时候,保证反序列返回结果是同一对象。

978100
领券