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

Java---静态内部

之前写过一篇双重锁校验,这是延迟加载的一种模式,俗称懒汉模式,这次写一个静态内部类的,这个写法天生线程安全,并且引出反射攻击,废话不多说,上代码: public class StaticInnerClass...return InnerClass.staticInnerClass; } private StaticInnerClass(){ } } 这种静态内部类的实现方式...,它主要原理是:加载一个类时,其内部类不会同时被加载。...一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生,也就是说内部类:InnerClass只有我们调用getInstance()的时候才会被加载。...这就是他线程安全的原因,通俗的说就是这个静态内部类只能同时有一个线程去初始化它,其他的被阻塞,如果一个线程初始化了这个静态内部类,那么其他的就不会再去初始化了。

14820

模式与静态方法_静态内部模式原理

本文主要介绍java的模式,以及详细剖析静态内部类之所以能够实现的原理。OK,废话不多说,进入正文。 首先我们要先了解下单的四大原则: 1.构造私有。 2.以静态方法或者枚举返回实例。...我们常用的模式有: 饿汉模式、懒汉模式、双重锁懒汉模式、静态内部类模式、枚举模式,我们来逐一分析下这些模式的区别。...故而,可以看出INSTANCE在创建过程中是线程安全的,所以说静态内部类形式的可保证线程安全,也能保证的唯一性,同时也延迟了的实例化。...那么,是不是可以说静态内部就是最完美的模式了呢?...其实不然,静态内部类也有着一个致命的缺点,就是传参的问题,由于是静态内部类的形式去创建的,故外部无法传递参数进去,例如Context这种参数,所以,我们创建时,可以在静态内部类与DCL模式里自己斟酌

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

使用静态内部类来创建

我们都知道创建模式有懒汉,饿汉。但是我们还可以利用类的加载机制,和静态内部类来创建。 静态内部类什么时候加载?...扩展:静态内部类创建 public class Singleton { private Singleton() {} static class SingletonHolder { private...Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } } 创建多种...故而,可以看出INSTANCE在创建过程中是线程安全的,所以说静态内部类形式的可保证线程安全,也能保证的唯一性,同时也延迟了的实例化。...那么,是不是可以说静态内部就是最完美的模式了呢?其实不然,静态内部类也有着一个致命的缺点,就是传参的问题,由于是静态内部类的形式去创建的,故外部无法传递参数进去。

87410

Java设计模式-模式-静态内部

静态内部类特点 1)外部类装载的时候,静态内部类不会状态 2)静态类所在的外部类使用内部类时,静态内部类会装载 3)静态内部类在装载时是线程安全的,只会装载一次 使用-静态内部类优缺点分析 1)这种方式采用了类装载的机制来保证初始化实例时只有一个线程...2)静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化...3)类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的 4)优点:避免了线程不安全,利用静态内部类特点实现延迟加载,效率高

1.7K00

【地铁上的设计模式】--创建型模式:模式(四)--静态内部

什么是静态内部 静态内部是一种模式的实现方式,它使用一个私有的静态内部类来持有对象,从而保证对象的唯一性。静态内部类只有在被调用时才会被加载,同时创建唯一的对象。...由于静态内部类只会被加载一次,因此它也具有懒加载的能力。静态内部既保证了线程安全,又具有较好的性能表现,是一种比较优秀的模式实现方式。...如何实现静态内部 实现静态内部的步骤如下: 创建一个外部类,构造方法为私有,防止外部类直接实例化。...静态变量instance在静态初始化块中被初始化,保证了对象的唯一性线程安全性。 总结 静态内部模式能够实现延迟加载、线程安全高效访问,且实现简单,是模式中最优秀的一种实现方式。...其缺点是不能够通过反射来创建新的实例,需要特殊处理

25720

第20次文章:内部类+设计模式

-模式可以在系统设计全局的访问点,优化环共享资源访问,例如可以设计一个类,负责所有数据表的映射处理。 3、常见的5中模式实现方式: (1)主要: -饿汉式(线程安全,调用效率高。...并且可以天然的防止反射反序列化漏洞) 4、模式的实现与检测 我们对5种模式都进行了相应的实现。下面我们主要对饿汉式懒汉式进行一个详解。...tips: 1.我们分别创建两个饿汉式懒汉式的模式,然后对比每种模式最后产生的对象是否相同,由最后的结果可以看出,饿汉式的两个对象s1s2是相同的,懒汉式的两个对象s3s4也是相同的。...6、如何选用 在上面的讲解中,我们主要讲解了饿汉式懒汉式的细节,其余的三种由于两种主要的模式比较类似,枚举式较为特殊,下面直接给出5种模式的对比,便于我们使用时候的选择: -对象占用资源少,...不需要延时加载:枚举式好于饿汉式 -对象占用资源大,需要延时加载:静态内部类式好于懒汉式

44420

模式(含多线程处理

走过路过不要错过 点击蓝字关注我们 ,顾名思义一个类只有一个实例。为什么要使用模式,或者说什么样的类可以做成单的?...这种情况下,如果我们不把类做成单,程序中就会存在多个一模一样的实例,这样会造成内存资源的浪费,而且容易产生程序错误。...在实际开发中,一些资源管理器、数据库连接等常常设计成单模式,避免实例重复创建。实现有几种常用的方式,下面我们来探讨一下他们各自的优劣。...singleton,在这个初始化过程中,其他的线程是无法访问该静态变量的,这是JVM内部帮我们做的同步,我们无须担心多线程问题,并且这个静态属性只会初始化一次,因此singleton是的。...以上内容介绍了几种常见的模式的实现方式,分析了在多线程情况下的处理方式, 在工作中可根据实际需要选择合适的实现方式。还有一种利用枚举来实现的方式,在工作中很少有人这样写过,不做探讨。

52420

java面试篇之手写静态内部类实现

为什么要使用的好处在之前的文章已经讲过了,建议先阅读这篇文章才疏学浅,写点文章~java模式,这次分享的主要是使用静态内部类的方式实现。...下面我们使用静态内部类的方式实现,代码可以跑在自己的IDE工具类上直接运行。...private static Singleton INSTANCE = new Singleton(); } } 我们通过多线程的方式进行模拟,通过运行时输出hashcode的值发现都一样,到这里的静态内部类实现方式的代码就完成了...希望这篇文章可以帮助到你,在面试时也是经常被面试官提起的,希望正在准备面试的你或者以后需要面试的可以得到帮助,喜欢文章的可以关注公众号,转发,分享。

68231

SpringMVC Controller多例

对于SpringMVC Controller多例,下面举了个例子说明下. 第一次:类是多例,一个普通属性一个静态属性。...第二次:类改为 结果:普通属性:0.............静态属性:0 普通属性:1.............静态属性:1 普通属性:2.............静态属性:2 普通属性:3................静态属性:3 所以说:对于情况普通属性和静态属性都会被共用。...静态属性:0 普通属性:1.............静态属性:1 普通属性:2.............静态属性:2 普通属性:3.............静态属性:3 所以说:springmvc默认是的...,所以controller里面不适合在类里面定义属性,只要controller中不定义属性,那么完全是安全的。

1K80

设计模式之原型

今天这篇文章我们来学习创建型设计模式的另外两个孪生兄弟,原型,其中原型设计模式中我们深入到JVM的内存模型,最后顺便谈谈Java中的值传递引用传递。...但通过我们查阅软件的七大设计原则 ,这很明显违反了依赖倒置原则,为了避免耦合让代码更易于维护,老王是不能依赖具体产品的。 二、 我们就需要将产品比对在创建产品的时候进行判断,老王就只管拿。...System.out.println("我俩一样..."); }else { System.out.println("我俩不一样..."); } } } 以上就是设计模式中的懒汉式饿汉式...布尔值))String,那么我们就使用浅拷贝。...既然说到了jvm的内存模型,就有必要说一下java中的值传递引用传递。

17310

JS模式策略模式

不推荐跨层级通信(如vue中爷孙组件通信时,可以使用Vuex传递数据,不建议直接跨层级通信)接口隔离原则:接口设计最小单元,高内聚、低耦合依赖倒置原则:抽象出来的方法、类应该是共性的内容,而不是很细节的内容模式详解实现方式使用闭包模式的核心思想是确保类只有一个实例...在 JavaScript 中,可以使用闭包来创建。...例如:全局状态管理:在 Redux 或 Vuex 中,通常会使用模式来创建全局的状态管理实例。日志记录器:当需要一个单一的日志记录器来跟踪应用程序中的日志信息时,可以使用模式。...:当有多种条件下需要选择不同的处理方式时,使用策略模式能使代码更清晰。...总结模式用于确保只有一个实例存在,而策略模式用于在运行时选择算法。它们都是为了解决不同类型的问题而设计的模式,可以帮助提高代码的灵活性可维护性。

13920

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

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

40020

ABAPJava模式的攻防

绕过了的限制,构造了第二个实例。 Java 除了用序列化/反序列化攻击外,还可以用反射攻击。 ?...然而我只需要将这个类JerrySingleton的构造函数通过反射设置成可以访问Accessible,然后就能通过反射调用该构造函数,进而生成新的对象实例。这样就破坏了模式。 ?...最理想的不会受到攻击的模式实现是借助Java里枚举类Enumeration的特性: ?...这种实现类型的模式的消费代码: System.out.println(“Name:” + JerrySingletonAnotherApproach.INSTANCE.getName()); 如果攻击者通过前面介绍的反射代码对这种实现方式的进行攻击...究其原因,是因为现在我们是通过Java枚举方式实现的,枚举类没有传统意义上的构造函数,因此对这种反射攻击免疫。

33510

ABAPJava模式的攻防

CALL TRANSFORMATION id SOURCE XML s RESULT model = lo_instance2. [1240] 绕过了的限制,构造了第二个实例。...[1240] 然而我只需要将这个类JerrySingleton的构造函数通过反射设置成可以访问Accessible,然后就能通过反射调用该构造函数,进而生成新的对象实例。这样就破坏了模式。...针对这种攻击,一种可行的防御措施是在类的构造函数内定义一个布尔变量,初始化为false。当构造函数执行后,该变量被置为true。...最理想的不会受到攻击的模式实现是借助Java里枚举类Enumeration的特性: [1240] 这种实现类型的模式的消费代码: System.out.println("Name:" + JerrySingletonAnotherApproach.INSTANCE.getName...()); 如果攻击者通过前面介绍的反射代码对这种实现方式的进行攻击,JDK会抛出NoSuchMethodException异常: [1240] 究其原因,是因为现在我们是通过Java枚举方式实现的

44640

小谈静态类模式

静态类(Static Class)(Singleton)都是在编程中用于实现特定类型的设计模式或代码组织方式。它们在不同的情境下有不同的用途特点。...常用于需要共享状态和数据的情况,以确保整个应用程序中只有一个实例存在。 使用场景 管理全局资源,例如日志记录器、配置管理器等。 控制特定资源的访问,以避免多个实例引发冲突。...而类有一个唯一的实例,通过该实例访问其方法属性。 状态维护: 静态类不维护任何实例状态,而可以维护状态并在应用程序中共享。 可扩展性: 静态类通常不能扩展,因为其方法是静态的。...类可以实现接口、继承或者使用其他方式进行扩展。 全局访问: 类通常用于提供全局访问点,以便在整个应用程序中共享状态。静态类的方法也可以通过类名直接访问,但没有类提供的灵活性可控性。...静态类适用于不需要维护状态的情况,而适用于需要共享状态资源的情况。选择使用哪种方式取决于你的应用程序的需求和设计目标。

30010
领券