java单例模式之懒汉式与饿汉式
首先我们介绍一下单例模式
- 单例类是只有一个实例对象;
- 该单例对象必须由单例类自行创建;
- 单例类对外提供一个访问该单例的全局访问点。
单例模式的优点
- 单例模式可以保证内存里只有一个实例,减少了内存的开销。
- 可以避免对资源的多重占用。
- 单例模式设置全局访问点,可以优化和共享资源的访问。
什么时候用到单例模式
- 需要频繁创建的一些类,使用单例可以降低系统的内存压力,减少 GC(垃圾回收)。
- 某些类创建实例时占用资源较多,或实例化耗时较长,且经常使用。
- 某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池、网络连接池等。
单例模式的创建:
饿汉式:
1.创建一个类 然后对类里面的构造器进行私有化 目的:防止外面调用该类创建对象 无法实现单例
2.一开始先创建一个静态对象 目的:这个对象就是单例
3.创建一个pubilc静态方法来返回对象,供外面调用该对象
代码如下:
//所谓的单例模式就是采取一定的方法保证整个系统软件中,对某个类实例只能存在单个类实例
public class SingletonTest1 {public static void main(String[] args){Bank bank1=Bank.getInstance();//通过调用内部类的方法 从而调用该对象Bank bank2=Bank.getInstance();//两个对象都是一样的System.out.println(bank1 == bank2);}}
//饿汉式模式
class Bank{//私有化类的构造器 目的:防止外面调用造对象 如果不将其定义成私有的// 那么便可以在外面不断的创建类对象 无法做到只有一个对象private Bank(){}//内部创建类的对象 要求此对象必须为静态 目的:在内部创建对象//为了能够对象 因为外面不能创建该类的对象private static Bank instance = new Bank();//但是为了使外部能够调用到该对象我们必须提供一个静态方法让外部调用//提供公共的静态方法,返回类对象public static Bank getInstance(){return instance;}
}
说明这个两个对象是一样的。
以上就是饿汉式的单例模式 :
优点:线程安全的
不足:一开始就创建对象容易造成空间浪费
懒汉式:
1.创建一个类 并将构造器设置为私有的 目的:防止外面的对象去调用 无法弄成单例模式
2.声明一个静态对象 但是没有初始化 等到要使用的时候再去初始化对象 避免占用内存空间
3.提供一个public static 方法供外面调用
代码如下:
public class SingletonTest2 {public static void main(String[] args){order order1=order.getInstance();order order2=order.getInstance();System.out.println(order1==order2);}}//懒汉式
class order{//1.私有化类的构造器 目的:为了不让在外面创建对象private order(){}//2.声明当前对象,没有初始化//4.此对象必须为静态private static order instance =null;//先设置为空 等要使用的时候再去创建对象//3.声明public、static返回当前对象的方法 目的:为外部调用提供方法 不然外部无法调用public static order getInstance(){if(instance==null){//这时如果有两个线程同时调用该方法 在这里面有可能出现线程的阻塞问题 导致创建出不同的对象instance=new order();}return instance;}}
上面就是懒汉式的单例模式
优点:避免内存空间浪费
不足:线程不安全 当多个线程同时调用的时候方法内部可能会发生阻塞 造成线程不安全
下面我们写一个线程安全的懒汉式模式:
class Bank1{private Bank1(){}private static Bank1 instance=null;public static Bank1 getInstance(){//方式一:效率稍差
// synchronized (Bank1.class){
// if(instance==null){
// instance=new Bank1();
// }
// return instance;
// }//方式二:效率稍好if(instance==null){synchronized (Bank1.class){if(instance==null){instance=new Bank1();}}}return instance;}}
public class SingletonSafeTest2 {public static void main(String[] args){Bank1 b1=Bank1.getInstance();Bank1 b2=Bank1.getInstance();System.out.println(b1==b2);}
}
上面我们使用同步代码块的方法将懒汉式线程不安全变成了线程安全。
以上就是关于单例模式之懒汉式与饿汉式的介绍 不足之处望各位大佬指教
java单例模式之懒汉式与饿汉式相关推荐
- JAVA单例模式:懒汉式,饿汉式
今天复习了一下java的单例模式,写了懒汉式和饿汉式的实现例子.代码如下: 1.懒汉式单例 package com.lf.shejimoshi;/*** @classDesc: 类描述:(懒汉式单例测 ...
- 关于Java单例模式中懒汉式和饿汉式的两种类创建方法
一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...
- 经典案例:单例模式之懒汉式和饿汉式
单例模式之懒汉式和饿汉式 文章目录 单例模式之懒汉式和饿汉式 一.单例模式是什么? 二.几种单例模式 1.懒汉模式 2.饿汉模式 三.懒汉模式和饿汉模式的区别 一.单例模式是什么? 保证整个系统中一个 ...
- java中的单例模式:懒汉式和饿汉式和静态内部类的书写
饿汉式: public class SingleTon {//1.私有化构造器private SingleTon(){}//2.在类内部创建一个对象private static SingleTon i ...
- 单例模式之懒汉式和饿汉式
目录 单例模式 懒汉式和饿汉式 懒汉式: 默认不会实例化,用的时候 new 饿汉式代码实现: 懒汉式和饿汉式区别: 懒汉模式: 饿汉模式: 执行效率上: 性能上: 单例模式 特点 : 只产生一个实例 ...
- 单例模式(懒汉式和饿汉式)及如何实现线程安全
单例模式有两种:懒汉式和饿汉式. 1 #include <iostream> 2 3 using namespace std; 4 5 6 // 保证在整个程序运行期间,最多只能有一个对象 ...
- 单例模式(懒汉式和饿汉式区别)
单例模式 所谓单例模式,就是保证类在内存中只有一个对象 而如何保证类在内存中只有一个对象? 思考一下,我们平时在实例化类的对象时,基本都是通过new 的方式来实例化一个对象,其实说白了,就是调用了需要 ...
- 单例模式的懒汉式和饿汉式的线程安全问题
单例模式一般有两种形式:懒汉式和饿汉式. 饿汉式是线程安全的,它的基本实现代码如下: public class SingletonTest1 {public static void main(Stri ...
- 单例模式:懒汉式和饿汉式
所谓单利模式,即只能开启一个线程,只有一个实例,并且能够实现自我实例化,主要分为懒汉式和饿汉式. (1)饿汉式 所谓饿汉式,就好比一个饿汉饿了好久,然后某一天到了餐厅,由于饿了很久,所以进入餐厅就希望 ...
最新文章
- 如何在同一台电脑开启多个tomcat服务器
- SAP EWM 性能优化(一)
- python将第一列替换_python-通过将另一列与第二个DataFrame进行比较来替换一列中的值...
- MySQL获取数据库每个表的行数
- 请求发送者与接收者解耦——命令模式
- Spartacus里HTTPErrorInterceptor的设计原理
- rabbitmq direct 多个消费者_一文解析 RabbitMQ 最常用的三大模式
- 数据结构之排序算法:基础概念
- Java ME游戏编程_Java ME游戏编程(第2版)
- web消息推送-goesay
- delphi与python_python和delphi哪个好
- 关于 onchange,onpropertychange,oninput事件
- java英语美式读音
- 音视频编解码技术之音频编码基本概念介绍
- Linux——网络桥接
- 车架号VIN码精准查询车辆信息
- Docker容器之间相互访问
- 【 Kotlin 脚本编程Kotlin Scripting 】Linux Shell 脚本与Kotlin Scripting
- 什么是PV、UV、QPS、TPS等专业术语?
- 线代 | 考研线性代数 解题方法汇总(非知识点汇总)