Java单例如何实现
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章将为大家详细讲解有关Java单例如何实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。单例模式,顾名思义,就是全局只保存有一个实例并且能够避免用户去手动实例
千家信息网最后更新 2026年11月04日Java单例如何实现
这篇文章将为大家详细讲解有关Java单例如何实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
单例模式,顾名思义,就是全局只保存有一个实例并且能够避免用户去手动实例化,所以单例模式的各种写法都有一个共同点,不能通过new关键字去创建对象,因此,如果能够通过构造方法实例化,那么就一定要将其声明为私有。
饿汉式
public class PersonResource { public static final PersonResource PERSON_RESOURCE_SINGLETON = new PersonResource(); private PersonResource(){} public static PersonResource getInstance() { return PERSON_RESOURCE_SINGLETON; }}这种方式可以说是最安全,也最简单的了,但却有一个缺点,那就是无论这个实例有没有被使用到,都会被实例化,颇有些浪费资源
懒汉式一
既然前一种方法有些浪费资源,那就换一种写法,让类在被调用的时候实例化
public class PersonResource { private static PersonResource personResourceSingleton; private PersonResource() { } public static PersonResource getPersonResourceSingleton(){ if(null==personResourceSingleton){ personResourceSingleton = new PersonResource(); } return personResourceSingleton; }}这种方式能够在需要用到该实例的时候再初始化,也能够在单线程下很好的运行,但如果是多线程就容易出现问题了。
懒汉式二
public class PersonResource { private static PersonResource personResourceSingleton; private PersonResource() { } public static PersonResource getPersonResourceSingleton(){ if(null==personResourceSingleton){ personResourceSingleton = new PersonResource(); } return personResourceSingleton; }}多线程之所以会出现问题,是因为多个线程能够并发执行getPersonResourceSingleton方法,从而导致在判断是否为空时出现问题。
既然如此,加上锁 ,使其互斥即可。这里又出现了一个问题,每次获取实例的时候都需要加锁解锁,而当一个实例已经被产生后,再加锁就有些多余了;
懒汉式三(双重检查)
public class PersonResource { private PersonResource(){ } private volatile static PersonResource personResource; public static PersonResource getInstance(){ if(personResource==null){ synchronized (PersonResource.class){ if(personResource==null){ personResource = new PersonResource(); } } } return personResource; }}既然实例确定产生后不再需要加锁,那我们在获取锁前先判断一次是否已经有实例存在就可以解决问题了
静态内部类
public class PersonResource { private PersonResource(){} private static class PersonResourceHolder{ public static PersonResource personResourceSingleton = new PersonResource(); } public static PersonResource getInstance(){ return PersonResourceHolder.personResourceSingleton; }}除了双重检查能够保证安全的单例外,用一个静态内部类去持有单例也是可以的,静态内部类保证了不会随外部类的加载而加载,这保证了延迟加载,同时在加载该类的时候就实例化单例,保证了线程安全;
枚举
public enum PersonResource { /** * PersonResource单例 */ personResource; public void setPersonResource(){ }}关于"Java单例如何实现"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
实例
线程
问题
时候
保证
安全
懒汉
方法
篇文章
静态
写法
就是
方式
更多
模式
资源
检查
不错
实用
顾名思义
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
百单网互联网科技有限公司怎么样
中国互联网科技工作委员会毛军
互联网科技资迅
深圳齐家互联网科技
广州慧亚互联网科技怎么样
花神(南京)互联网科技有限公司
消费医药和互联网科技
乌鲁木齐新华智原互联网科技学校
互联网行业科技股
中和天地互联网科技有限公司
美国互联网科技实力
雨阳互联网卡科技有限公司
上海创道互联网络科技有限公司
宁波跨境商互联网科技有限公司
上海同邻互联网科技有限公司规模
互联网科技平台产品运营
陕西九四连强互联网科技有限公司
科技互联网公司两年变化
科技互联网专业务虚会材料
宁波允成互联网科技有限公司
新华互联网科技学校
朗新科技与工业互联网
互联网科技社
大白互联网科技
互联网科技公司的市场部门
小米互联网科技园设置
汽车互联网创新科技园
智腾互联网科技有限公司
艺电能源互联网科技有限公司招聘
福仕德教育科技互联网