您现在的位置是:首页 > 正文

java单例_最好懂的Java单例模式,没有之一

2024-02-29 11:39:19阅读 1

单例(Singleton)模式 也叫单态模式,是java的23种设计模式之一。网上很多介绍,我就言简意赅点了。

一、单例模式的应用场景

1.整个程序的运行中只允许有一个类的实例;

2.需要频繁实例化然后销毁的对象。

3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

4.方便资源相互通信的环境

场景举例:在我们的电脑中,每一个系统的电脑,比如windows中,都会有一个任务管理器,而且只有一个,你也只能打开一个,你可以在自己电脑试一下。因为他就是类似单例这种结构的模式做出来的;还有回收站、打印机的Printer Spooler等等。

二、单例模式的在项目中的具体使用

1.封装一些常用的工具类,保证整个应用常用的数据统一

2.保存一些共享数据在内存中,其他类随时可以读取。

三、单例模式的俩种形式懒汉式

饿汉式

四、单例模式实现步骤

1.构造方法必须进行私有化

2.实例必须是一个且唯一,并且必须加上static属性

3.对外提供获取该类对象的共有方法也是static属性

五、代码说明

(1)饿汉式:在程序创建的时候就进行初始化,并且对象唯一

public class Singleton {

private static String TAG = "Singleton";

private static Singleton singleton = new Singleton();

//单例模式的特点,构造必须私有 private Singleton() {

}

public static Singleton getInstance() {

return singleton;

}

public void hungry() {

System.out.println("Please call me 饥饿鬼");

}

}

(2)懒汉式:需要时才创建于堆中,多线程情况下不能保证唯一性

public class Singleton {

private static String TAG = "Singleton";

private static Singleton singleton = null;

//单例的特点,构造必须私有 private Singleton() {

}

public static Singleton getInstance() {

if (null == singleton) {

singleton = new Singleton();

}

return singleton;

}

public void lazy() {

System.out.println("Please call me 懒汉子");

}

}

**注意:在多线程情况下,只能使用饿汉式单例模式。在多线程的情况下,如果多个线程下同时使用懒汉式,第一线程刚创建完准备要返回就被其他线程抢到了又重新创建了一遍,这时就有多个对象存在了,那就不符合单例的原则了。因此才有了饿汉式单例,无论是几个线程抢到并使用,对象都只会有一个。

当然,是不是就意味着在多线程的情况下不能使用懒汉式来创建单例呢?

当然不是。这个时候,就需要给线程加锁。(使用synchronized修饰公有方法即可)

public class Singleton {

private static Singleton instance;

//单例的特点,构造必须私有 private Singleton (){

}

//使用synchronized修饰 public static synchronized Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

六、单例模式的利弊优点1.实现了整个程序对唯一实例访问的控制。

2.因为单例要求程序只能有一个对象,所以对于那些需要频繁创建和销毁的对象来说可以提高系统的性能,并且可以节省内存空间。

3.可以全局访问。

4.允许可变数目的实例。缺点1. 不适用于变化频繁的对象。

2.符合的场景有限。

3.如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,可能会导致对象状态的丢失

4.可扩展性较差。

网站文章

  • ssm 开发maven项目jar包不能用的问题

    这里写自定义目录标题新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPan...

    2024-02-29 11:38:49
  • 原来编码就是这么简单

    原来编码就是这么简单

    日期:2019年12月26日作者:Commas注释:对于编码,我知道什么?对于编码,我不知道什么?文章目录一、什么是编码?二、为什么是编码?三、怎么样是编码?一、什么是编码?编码在我们生活中无处不在,暂且我们先不讨论计算机编码,举几个生活中的例子:身份证号码:前两位代表省、自治区、直辖市,比如说“44…”,代表广东省,而“43…”,代表湖南省;车牌号:第一个汉字代表车户口所...

    2024-02-29 11:38:42
  • DOM破坏绕过XSSfilter例题

    DOM破坏绕过XSSfilter例题

    DOM破坏(DOM Clobbering)指的是对网页上的DOM结构进行不当的修改,导致页面行为异常、性能问题、安全风险或其他不良影响的情况。就是⼀种将 HTML 代码注⼊⻚⾯中以操纵 DOM 并最终...

    2024-02-29 11:38:34
  • 如何判断链表有环的三种解法(Python)

    一、问题描述 二、解题思路 三、最优解的代码实现 一、问题描述 有一个单向链表,链表中有可能出现环,如何判断链表是否有环? 二、解题思路 方法一: 首先从头节点开始,依次遍历单链表中的每一个节点。每遍...

    2024-02-29 11:38:04
  • 全国计算机考试实验室建设,实验室介绍

    1.2001年计算中心验室被辽宁省教委授予“合格实验室”称号2.2009年东北大学秦皇岛分校考点被教育部评为“全国计算机等级考试优秀点。3.2010年获辽宁省教学厅“2009-2010年度辽宁省普通高...

    2024-02-29 11:37:58
  • C#-2 C#程序

    C#-2 C#程序

    一 C#程序是一组类型声明C#程序或DLL的源代码是一组一种或多种类型声明。对于可执行程序,类型声明中必须有一个包含Main方法的类。命名空间是一种把相关的类型声明分组并命名的方法。是类在程序集中逻辑...

    2024-02-29 11:37:44
  • 用java语言求前50个素数_显示前50个素数

    package my.group.mapreduce1;import java.util.Scanner;public class Djsi {public static void main(String[] args){int NUMBER_OF_PRIMES = 50; //设置输出素数的个数int count = 0; //计数int number = 2; //从2开始查找Syst...

    2024-02-29 11:37:14
  • 记录网页制作中遇到的问题及解决办法(长期更新)

    1.html在浏览器打开后出现"白边"原因:浏览器默认边距值不是0解决:在<head></head>内加入以下内容:<style type="text/css">*{margin:0;padding:0;}</style>

    2024-02-29 11:37:08
  • 【Python】实现csv文件转json文件

    import json import pandas as pd # 读取CSV文件 csvData = pd.read_csv(r&#39;testData.csv&#39;, header = 0)...

    2024-02-29 11:37:02
  • 计算机游戏专业宣传语,游戏的广告词_游戏推广广告词

    现在有很多的游戏,电脑或者手机上的都很多,在每一款游戏推出的时候,都会用创意的广告词进行推广,吸引人玩游戏。下面是学习啦小编为你整理的游戏的广告词,希望对你有用!最新游戏的广告词1.狭路相逢,谁与争锋...

    2024-02-29 11:36:33