侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

java 单例模式(饿汉模式与懒汉模式)

Java  /  管理员 发布于 2年前   175

java 单例模式

饿汉式单例

对于饿汉模式,我们可这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。

懒汉式单例类

对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。

单例设计模式常用于JDBC链接数据库

注意:

1 我们常用的是第一种饿汉式,因为:

 (1)既然采用了单例设计模式,就是为了使用单例类的对象,所以就先把他实例化出来.

 (2)在懒汉式中存在一定的安全隐患,需要加上同步关键字synchronized,否则就谈不上单例了,但是加上了synchronized效率就稍逊了

2 在第一种办法中,代码private static final Single SINGLE=new Single();为什么有final呢?

因为被final关键字修饰的类,不能被继承,被final修饰的成员变量不可以被修改.

此处用了final为了强化和重点突出:"同一对象"这个概念――只有这么一个对象,而且它是不可以被修改的.

如果不用final修饰 Single SINGLE那么就会有这么一种情况:业务很复杂,在不经意间就修改了此对象,造成各种错误.

第一种(饿汉式):

思路:

(1)不让其他类建立该类的对象.即将构造函数设置为私有!
(2)自定义一个本类对象
(3)将自定义的对象提供出去.即定义一个get方法,返回值为此类的对象。

 分析:

 第一步:将单例类中构造函数私有化了且利用一个get()函数向外提供此类的对象,所以其他类无法构造此类的对象。
 第二步:但其他类要想调用此单例类里的方法,于是只有采用内名.方法名()来实现,这就要求这个方法必须是静态static的。
 第三步:又因为静态方法只能访问静态成员!所以要将SINGLE设置为静态的

public class SingleDemo {   public static void main(String[] args) {      Single s1=Single.getSingle();      s1.setNumber(44);      Single s2=Single.getSingle();      s2.setNumber(55);      System.out.println("s1.number="+s1.number);      System.out.println("s2.number="+s2.number);      if(s1.equals(s2)){         System.out.println("s1与s2是同一对象即:s1==s2");//if条件成立        }    } }   class Single{   int number;   public int getNumber() {        return number;      }   public void setNumber(int number) {        this.number = number;      }   private Single(){};//第一步   private static final Single SINGLE=new Single();//第三步   public static Single getSingle(){//第一步和第二步        return SINGLE;   } } 

第二种(懒汉式):

package cn.com; public class SingleDemo2 {    public static void main(String[] args) {       Single s1=Single.getSingle();       s1.setNumber(44);       Single s2=Single.getSingle();       s2.setNumber(55);       System.out.println("s1.number="+s1.number);       System.out.println("s2.number="+s2.number);       if(s1.equals(s2)){         System.out.println("s1与s2是同一对象即:s1==s2");//if条件成立        }      }   }   class Single{    int number;    public int getNumber() {        return number;      }    public void setNumber(int number) {        this.number = number;      }    private Single(){};    private static Single SINGLE=null;    public static synchronized Single getSingle(){//多线程时加上synchronized是关键!!!       if(SINGLE==null){          SINGLE=new Single();          return SINGLE;        }       else{          return SINGLE;         }    } } 

以上就是对java 单例设计模式的详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


  • 上一条:
    详解Spring Boot 中使用 Java API 调用 lucene
    下一条:
    MVC、MVP和MVVM分别是什么
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • java 正则表达式基础,实例学习资料收集大全 原创(0个评论)
    • java正则表达式彻底研究(0个评论)
    • java正则表达式验证函数(0个评论)
    • MVC、MVP和MVVM分别是什么(0个评论)
    • java 单例模式(饿汉模式与懒汉模式)(0个评论)
    • 近期文章
    • Laravel 9.24版本发布(0个评论)
    • windows系统phpstudy环境中安装amqp拓展流程步骤(0个评论)
    • windows10+docker desktop使用docker compose编排多容器构建dnmp环境(0个评论)
    • windows10+docker desktop运行laravel项目报错:could not find driver...(0个评论)
    • windows10+docker desktop报错:docker: Error response from daemon: user declined directory sharing(0个评论)
    • go语言中Pat多路复用器路由功能示例代码(0个评论)
    • go语言中HttpRouter多路复用器路由功能示例代码(0个评论)
    • js中使用Push.js通知库将通知推送到浏览器(0个评论)
    • Laravel collect集合中获取二维数组中键值功能示例代码(0个评论)
    • 10分钟设置免费远程桌面(0个评论)
    • 近期评论
    • nkt 在

      阿里云香港服务器搭建自用vpn:Shadowsocks使用流程步骤中评论 用了三分钟就被禁了,直接阿里云服务器22端口都禁了..
    • 熊丽 在

      安装docker + locust + boomer压测环境实现对接口的压测中评论 试试水..
    • 博主 在

      阿里云香港服务器搭建自用vpn:Shadowsocks使用流程步骤中评论 @test  也可能是国内大环境所至,也是好事,督促你该研究学习新技术..
    • test 在

      阿里云香港服务器搭建自用vpn:Shadowsocks使用流程步骤中评论 打了一次网页,然后再也打不开了。。是阿里云的缘故吗?..
    • 博主 在

      centos7中Meili Search搜索引擎安装流程步骤中评论 @鹿   执行以下命令看看你的2.27版本是否存在strin..
    • 2016-11
    • 2018-03
    • 2020-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客