千家信息网

Java单例模式怎么写

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"Java单例模式怎么写",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java单例模式怎么写"吧!这个模式是很有意思,而且比较简单,但是我
千家信息网最后更新 2026年11月02日Java单例模式怎么写

本篇内容主要讲解"Java单例模式怎么写",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java单例模式怎么写"吧!

这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝

中国的历史上很少出现两个皇帝并存的时期,是有,但不多,那我们就认为皇帝是个单例模式,在这个场景中,有皇帝,有大臣,大臣是天天要上朝参见皇帝的,今天参拜的皇帝应该和昨天、前天的一样(过渡期的不考虑,别找茬哦),大臣磕完头,抬头一看,嗨,还是昨天那个皇帝,单例模式,绝对的单例模式,先看类图:

然后我们看程序实现,先定一个皇帝:

package com.cbf4life.singleton1;/***中国的历史上一般都是一个朝代一个皇帝,有两个皇帝的话,必然要PK出一个皇帝出来*/public class Emperor {       private static Emperor emperor = null;       //定义一个皇帝放在那里,然后给这个皇帝名字       private Emperor(){        //世俗和道德约束你,目的就是不让你产生第二个皇帝        }        public static Emperor getInstance(){            if(emperor == null){  //如果皇帝还没有定义,那就定一个                emperor = new Emperor();            }            return emperor;        }    //皇帝叫什么名字呀    public static void emperorInfo(){        System.out.println("我就是皇帝某某某....");    }}

然后定义大臣:

package com.cbf4life.singleton1;/***大臣是天天要面见皇帝,今天见的皇帝和昨天的,前天不一样那就出问题了!*/@SuppressWarnings("all")public class Minister {        public static void main(String[] args) {            //第一天            Emperor emperor1=Emperor.getInstance();            emperor1.emperorInfo(); //第一天见的皇帝叫什么名字呢?            //第二天            Emperor emperor2=Emperor.getInstance(); Emperor.emperorInfo();            //第三天            Emperor emperor3=Emperor.getInstance(); emperor2.emperorInfo();            //三天见的皇帝都是同一个人,荣幸吧!        }}

看到没,大臣天天见到的都是同一个皇帝,不会产生错乱情况,反正都是一个皇帝,是好是坏就这一个,只要提到皇帝,大家都知道指的是谁,清晰,而又明确。问题是这是通常情况,还有个例的,如同一个时期同一个朝代有两个皇帝,怎么办?

单例模式很简单,就是在构造函数中多了加一个构造函数,访问权限是 private 的就可以了,这个模式是简单,但是简单中透着风险,风险?什么风险?在一个 B/S 项目中,每个 HTTP Request 请求到 J2EE 的容器上后都创建了一个线程,每个线程都要创建同一个单例对象,怎么办?,好,我们写一个通用的单例程序,然后分析一下:

package com.cbf4life.singleton3;/***通用单例模式*/@SuppressWarnings("all")    public class SingletonPattern {        private static SingletonPattern singletonPattern= null;        //限制住不能直接产生一个实例        private SingletonPattern(){        }        public SingletonPattern getInstance(){            if(this.singletonPattern == null){    //如果还没有实例,则创建一个                this.singletonPattern = new SingletonPattern();            }            return this.singletonPattern;        }}

我们来看黄色的那一部分,假如现在有两个线程 A 和线程 B,线程 A 执行到 this.singletonPattern = new SingletonPattern(),正在申请内存分配,可能需要 0.001 微秒,就在这 0.001 微秒之内,线程 B 执行到 if(this.singletonPattern == null),你说这个时候这个判断条件是 true 还是 false?是 true,那然后呢?线程 B 也往下走,于是乎就在内存中就有两个 SingletonPattern 的实例了,看看是不是出问题了?

如果你这个单例是去拿一个序列号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上还看不出什么问题,这才是最要命的!因为这种情况基本上你是重现不了的,不寒而栗吧,那怎么修改?有很多种方案,我就说一种,能简单的、彻底解决问题的方案:

package com.cbf4life.singleton3;/***通用单例模式*/@SuppressWarnings("all")    public class SingletonPattern {        private static final SingletonPattern singletonPattern= new   SingletonPattern();        //限制住不能直接产生一个实例        private SingletonPattern(){        }        public synchronized static SingletonPattern getInstance(){ return singletonPattern;        }}

直接 new 一个对象传递给类的成员变量 singletonpattern,你要的时候 getInstance()直接返回给你,解决问题!

到此,相信大家对"Java单例模式怎么写"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

皇帝 模式 线程 大臣 问题 两个 实例 就是 名字 对象 情况 时候 还是 风险 内存 内容 函数 历史 怎么办 时期 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技赋能下的互联网金融 科技企业和互联网企业 万易互联网科技有限公司 有木互联网科技 重庆科技学院互联网 中国互联网金融科技基金 中国最先进互联网科技公司 深圳前海聚择互联网科技有限公司 创业天下互联网科技有限公司 河南住房之家互联网科技 四川慕妮娅互联网科技有限公司 工业互联网山东科技大学 国大互联网教育科技有限公司薪资 江苏苏星互联网科技有限公司 互联网科技快讯热点 本届互联网大会上的黑科技 互联网金融运营模式中的金融科技 科技互联网经济论坛 安徽零酒互联网科技有限公司 科技发展第三阶段互联网时代 耶加雪菲 什么是科技互联网 A股互联网金融科技公司 疫情对互联网科技公司影响 互联网科技金融公司 佩信高科技互联网 宜昌元轩互联网科技有限公司 互联网企业科技类企业如何做账 兰石爱特工业互联网科技分公司 互联网金融金融科技
0