使用静态内部类实现单例模式
代码如下:
/*** Created on 2017/5/5.* Author:crs* Description:使用静态内部类的方式实现单例模式*/
public class Singleton {private Singleton() {}public static final Singleton getInstance() {return SingletonHolder.INSTANCE;}public static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}
}
1) 如何保证线程安全: 因为内部的静态类只会被加载一次,只会有一个实例对象,所以是线程安全的
2) 内部类的加载机制: java中的内部类是延时加载的,只有在第一次使用时加载;不使用就不加载;
类的加载机制: 虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化;静态内容首先被加载,相当于全局的成员变量。
当静态方法getInstance()加载时,SingletonHolder.INSTANCE默认初始值是空的,只有当调用次方法时,内部类才会被实例化。
Singleton类被装载了,instance不一定被初始化,因为它是内部类中的成员。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。
如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。
利用了classloader的机制来保证初始化instance时只有一个线程,所以也是线程安全的,同时没有性能损耗。
final修饰的方法,不能被重写;当子类继承时此方法不能被修改。
由final修饰的变量是常量,常量名全部大写。
使用静态内部类实现单例模式相关推荐
- 内部类大展身手——— 静态内部类实现单例模式
提到单例模式,如下代码首当其冲: public class Singleton {private static Singleton instance;private Singleton (){}pub ...
- 静态内部类的单例模式如何保证线程安全
一,单例模式有6种实现方式: 1.懒汉式: 2.懒汉式-加锁: 3.双重检验锁: 4.饿汉式: 5.静态内部类: 6.枚举: 1.懒汉式: public class Singleton { //私有的 ...
- 静态内部类实现单例模式
StaticInnerClass 静态内部类的外部调用 静态内部类可以直接创建对象 new B.C(); 如果内部类不是静态的,那就得这样 B b = new B(); B.C c = b.new C ...
- 静态内部类实现 单例模式
package model; public class MySingleTon { //1:饿汉 一旦完成加载,就把单例初始化完成,getInstance时已存在 // private final s ...
- 【JVM】为什么静态内部类实现单例模式是线程安全?
首先给出代码: //基于类初始化的线程安全的单例 class SingleTon4{private SingleTon4(){} private static class InnerClass{pri ...
- 静态内部类实现单例模式及其线程安全相关原理
实现方式 public class SingleTonInstance {private SingleTonInstance(){};public static SingleTonInstance g ...
- 单例模式的四种实现方式(饿汉模式、懒汉模式、静态内部类、枚举类)
首先,设计模式是我们程序员在软件开发过程中面临的一般问题的解决方案,通过学习设计模式可以使我们在编程时更加有条理性,同时培养我们写代码的思维能力,从而提高我们的工作效率.接下来就跟着博主的脚步往下走吧 ...
- Kotlin 静态内部类单例模式的正确实现方式
本篇是对现网上流传的 Kotlin 实现静态内部类单例模式的纠正,为了把原理说清楚,文章前奏可能会有些长,熟悉静态内部类单例模式原理的朋友,可以直接跳转到文章最后,直接看结果即可. 最近在整理基础库的 ...
- java静态内部类单例模式_单例模式-静态内部类实现及原理剖析
以我的经验为例(如有不对欢迎指正),在生产过程中,经常会遇到下面两种情况: 1.封装的某个类不包含具有具体业务含义的类成员变量,是对业务动作的封装,如MVC中的各层(HTTPRequest对象以Thr ...
最新文章
- MySQL数据库聚合函数(count、max、min、sum、avg)
- 额外域建立FSMO角色转移及夺取
- 组件化h5活动模板的实现
- java mvc数据库 封装_关于SpringMvc参数封装_JavaEE框架(Maven+SpringMvc+Spring+MyBatis)全程实战教程_Java视频-51CTO学院...
- 如何实现Android端获取RTSP|RTMP流转推RTMP
- lombok之@RequiredArgsConstructor注解
- 意见簿---在批评中成长
- 吴恩达机器学习ex7:PCA降维
- Graphviz样例之UML图
- CTF-Crypto
- Hello软件项目相关功能测试点
- transmit video
- python培训价目表-培训python大概要多少钱?
- 如何看待哔哩哔哩(B站)的后端代码主仓库被上传至了GitHub?
- 恐怖系列丨互联网幕后攻防:咳血的独角兽之血腥丛林中的无底线战争
- 中国石油大学《机械电气安全技术(含课程设计)》
- 硬件安全: 动态信息流跟踪
- java之xml进阶教程——使用castor框架
- 微信小程序|基于小程序实现人脸数量检测
- React 中ref 的使用(类组件和函数组件)以及forwardRef 与 useImperativeHandle 详解
热门文章
- UWP平台和PC平台有什么区别
- ZigBee无线传感——CC2530单片机定时器1PWM输出
- 程序员的迷茫,迷茫的程序员
- HDU 悼念512汶川大地震遇难同胞——老人是真饿了
- 负载均衡策略-七种策略
- makefile中的CPPFLAGS LDFLAGS CFLAGS选项详解
- bt_code(2012.3.17)
- 语音合成(TTS)论文优选:ByteSing: A Chinese Singing Voice Synthesis System Using Duration Allocated Encoder-De
- DPVO:深度patch视觉里程计(arXiv 2022)
- 光流的获取方法(自用)