【Java】单例模式
时间:2019-12-23
本文章向大家介绍【Java】单例模式,主要包括【Java】单例模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
单例模式定义:
该种模式设计也给单一的类,简单来说就是我创建我自己,使得内存中只有一个对象。
为什么这样做呢,因为在Java中,创建对象是需要消耗资源的,如果一个类放在全局中,它的实例可能会被频繁地创建和销毁,那么我把类构造器器私有化,那么一个类只有一个实例,我一是控制了实例地数目,二是节约了资源,三提供了可以访问的全局访问点。举个例子,一些设备管理器常常被设计为单例模式,系统在操作文件的时候,就不可避免出现多个线程或者进程同时操作一个文件,所以该要通过唯一一个实例来进行处理。
懒汉模式:在类加载的时候不被初始化,而是在需要的时候才会被初始化,因此不加锁的情况下不是多线程安全的。
饿汉模式:在类加载的时候就被初始化了。由于基于classloader机制避免了多线程同步的问题,但是在类加载的时候就初始化,也浪费了内存。
那么,由单例模式就引出了三个问题:
1.设计一个饿汉模式,该类构造方法私有化。
class Singleton{
//为什么这里要私有化,因为如果在外部访问的化,虽然我可以创建俩个不同名字的静态实例都是指向同一个地址,但是我也可以把其中一个置为空,但是就不符合单例模式思想了 private staitc Singleton instance = new Singleton();
//为什么构造函数私有化,这样该类就不能被被外部实例化了。 private Singleton(){}
//提供一个外部的接口用来调用内部的静态实例 public static Singleton getInstance(){ return instance; } }
2.Java中有哪些模式是单例模式:
Runtime类,Pattern类
3.设计一个线程同步的懒汉模式:
class Singleton{
//volatitle保证了内存可见 private static volatile Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if(instance == null) {
//为什么不在getInstance加锁,因为只有instance为空的时候才会发生抢,这就导致了函数加锁后接下来不为空的情况每次只能有一个线程访问,效率太低。 synchronized(Singleton.class) {
//线程们抢到了getInsrance,但是由于volatitle,只有一个线程能创建isntance,所以在这里还要判断一次,而且创建完了以后调用都走不到这里了。 if(instance == null) { instance = new Singleton(); } } } return instance; } }
参考文章:
原文地址:https://www.cnblogs.com/guangluwutu/p/12088421.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- socket接口层分析
- 数据存储方式——JSON、CSV、MongoDB、Redis、MySQL
- Spring Boot引入swagger-ui 后swagger-ui.html无法访问404
- 多路复用IO内幕
- Linux信号处理
- Shopify主题title/description等SEO设置
- Golang实现守护进程
- LaTeX简单常用方法笔记
- Convolution_model_Application_v1a
- Windows平台快速安装MongoDB和Robo 3T
- Linux内存管理 - slab分配器
- akka-grpc - 基于akka-http和akka-streams的scala gRPC开发工具
- Redis Sentinel原理与实现 (中)
- Keras_Tutorial_v2a
- 根据字符串生成对应Hash值