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

一、单例模式的应用场景

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

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

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

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

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

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.可扩展性较差。

java单例模式的应用场景_java项目中单列模式适用于什么场景?相关推荐

  1. java的相对路径用法_java项目中的绝对路径和相对路径用法说明

    java项目中的绝对路径和相对路径用法说明 绝对路径:不可改变的路径 本地绝对路径:增加盘符的路径(e:/test/test.html) 网络绝对路径:增加协议,IP地址,端口号的路径(http:// ...

  2. java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份

    Java项目中调用bat批处理配合使用BCP进行多用户数据的备份 一.项目需求 最近项目中需要对数据库(Sql Server系列数据库)进行备份.项目中的需求不是简单的整个数据库的备份,而是根据用户来 ...

  3. java解决跨域问题_Java项目中如何解决跨域问题

    Java项目中如何解决跨域问题 发布时间:2020-11-11 16:00:40 来源:亿速云 阅读:91 作者:Leah Java项目中如何解决跨域问题?很多新手对此不是很清楚,为了帮助大家解决这个 ...

  4. java 遍历属性文件路径_Java项目中读取properties文件,以及六种获取路径的方法...

    Java读取properties文件的方法比较多,网上最多的文章是"Java读取properties文件的六种方法",但在Java应用中,最常用还是通过java.lang.Clas ...

  5. java用户登录记住密码_java项目中登陆时记住密码

    1.在登陆的时候记住密码,不知自动登陆: 2.登陆页面,填写用户名,密码,点击记住密码,下次进入登陆页面的时候,填写同样的用户名,密码自动填充(在不一次会话的情况下也就是说在不关闭浏览器的情况下): ...

  6. Redis在项目中的地位及使用场景剖析

    Redis在项目中的地位及使用场景剖析 一. redis 特点 所有数据存储在内存中,高速读写 提供丰富多样的数据类型:string. hash. set. sorted set.bitmap.hyp ...

  7. java jndi使用_Java项目中使用JNDI连接数据库

    因为写的大作业经常用到数据库连接 所以自己写了个数据库连接的类 package DB_Link_info;/* * 数据库链接信息 */public class DB_link_Info {publi ...

  8. java通信项目_Java项目中的多线程通信如何利用Socket实现

    Java项目中的多线程通信如何利用Socket实现 发布时间:2020-11-24 16:44:40 来源:亿速云 阅读:96 作者:Leah 这期内容当中小编将会给大家带来有关Java项目中的多线程 ...

  9. java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务

    java项目中如何利用多线程实现一个定时器任务 发布时间:2020-11-10 16:04:03 来源:亿速云 阅读:86 作者:Leah 今天就跟大家聊聊有关java项目中如何利用多线程实现一个定时 ...

最新文章

  1. Python 学习笔记01
  2. 【机器视觉】 global算子
  3. UEFI + GPT 启动 VHD
  4. 经典面试题(32):以下代码将输出的结果是什么?
  5. mysql写入 cpu飙升_分析MySQL中索引引引发的CPU负载飙升的问题
  6. Adroid新增硬件编解码
  7. Active Report 紙張設置小結
  8. HBase之Region上Spilt流程分析
  9. C++之左值引用与右值引用
  10. 【数学建模】Lingo软件介绍+常用函数总结+样例
  11. 【数据库原理及应用】经典题库附答案(14章全)——第一章:数据库基础知识
  12. 颜色对照表(二)(16进制、RGB、CMYK、HSV、中英文名)
  13. linux查看服务器防火墙策略,linux防火墙的策略规则
  14. 为什么用CDN给你网站加速?
  15. xcode7的那些坑-“Your binary is not optimized for iPhone 5” (ITMS-90096) when submitting
  16. 热爱3D游戏建模,副业兼职外包可以做到什么程度?
  17. 兔子与兔子 字符串hash
  18. outlook2010 html签名,Outlook2010如何设置签名
  19. 论文笔记:CVPR2022 Regional Semantic Contrast and Aggregation for Weakly Supervised Semantic Segmentation
  20. 计算机 游戏第24级,全国计算机一级考试题库-全国计算机等级考试题(24页)-原创力文档...

热门文章

  1. Opencv3.2移植到arm板
  2. 那些看过一次后,就令人心里一动的美好词汇
  3. 100+实用功能合集,手机中的神器,黑科技中的战斗鸡!
  4. Python时间戳转为北京时间
  5. windows画图工具入口
  6. mac 命名 报错 请尝试使用字符较少,或不含标点符号的名称。
  7. cad2016中选择全图字体怎么操作_cad教程分享CAD中如何删除顽固图层?
  8. java向量加法_结构-03. 平面向量加法(10) java
  9. ##CSAPP读书日记-第九章-虚拟内存
  10. seata xid是什么_急:IDMA是什么?SDMA又是什么?