Java编程--单例(Singleton)设计模式
单例设计模式
一个类只有一个实例,根据创建的时机又分为懒汉式和饿汉式,它们的区别主要体现在实例的创建时机和线程安全性上。
饿汉式(Eager Initialization):
- 特点: 在类加载时就创建实例,因此也被称为饿汉式单例。无论是否需要使用该实例,都会在类加载时创建,因此具有线程安全性。
- 优点: 简单明了,线程安全。
- 缺点: 如果该实例很大,而在程序运行过程中没有被用到,会造成资源浪费。
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {
// 私有构造方法
}
public static EagerSingleton getInstance() {
return instance;
}
}
懒汉式(Lazy Initialization):
- 特点: 在需要使用实例时才进行创建,因此被称为懒汉式单例。懒汉式在多线程环境下需要考虑线程安全性,可以通过添加同步锁或使用双重检查锁定等方式实现。
- 优点: 延迟加载,避免了资源浪费。
- 缺点: 需要考虑线程安全性,可能会引入性能开销。
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {
// 私有构造方法
}
// 懒汉式,添加同步锁保证线程安全
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
双重检查锁定(Double-Checked Locking):
- 特点: 在懒汉式的基础上引入双重检查,以提高效率。在实例不存在时加锁,然后再次检查实例是否存在,避免每次获取实例都加锁的性能开销。
- 优点: 延迟加载,提高了效率。
- 缺点: 在早期版本的Java中,由于指令重排的问题可能导致线程不安全,需要使用volatile关键字修饰实例变量。
public class DoubleCheckedSingleton {
private static volatile DoubleCheckedSingleton instance;
private DoubleCheckedSingleton() {
// 私有构造方法
}
public static DoubleCheckedSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckedSingleton.class) {
if (instance == null) {
instance = new DoubleCheckedSingleton();
}
}
}
return instance;
}
}
Java编程--单例(Singleton)设计模式的更多相关文章
- 瞎扯设计模式1:单例模式 饿汉模式 懒汉模式 线程安全的单例 singleton 设计模式 java
[原创声明]此文为本人原创,欢迎转载,转载请注明出处,作者链接~ http://www.cnblogs.com/m-yb/p/8833085.html 单例很常用,面试也经常被问,如:不用自定义锁怎么 ...
- Java中 单例(Singleton)的两种方式
第一种(饿汉式单例模式):在声明变量时实例化 public class Singleton { //静态初始化自动实例化 private static Singleton instance = new ...
- java的单例设计模式
java的单例设计模式包括:饿汉设计模式和懒汉设计模式: 步骤: 1.创建一个对象把他设置为私有的成员变量,保证唯一 2.私有构造方法,防止new一个对象. 3.定义一个公开的静态方法,返回第一步创建 ...
- 深入浅出单实例Singleton设计模式
深入浅出单实例Singleton设计模式 陈皓 单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了.这个设计模式主要目的是想在整个系统 ...
- Hi,我们再来聊一聊Java的单例吧(转)
1. 前言 单例(Singleton)应该是开发者们最熟悉的设计模式了,并且好像也是最容易实现的——基本上每个开发者都能够随手写出——但是,真的是这样吗? 作为一个Java开发者,也许你觉得自己对单例 ...
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...
- 跨应用程序域(AppDomain)的单例(Singleton)实现
转载自: 跨应用程序域(AppDomain)的单例(Singleton)实现 - CorePlex代码库 - CorePlex官方网站,Visual Studio插件,代码大全,代码仓库,代码整理,分 ...
- Java设计模式之 — 单例(Singleton)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8860649 写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上 ...
- Java设计模式透析之 —— 单例(Singleton)
写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助你分析数据.但是Java原生带有的System.out.println()方法却很少在真正的项目开发中使用,甚至像f ...
- java设计模式-单例(singleton)
单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例 如何保证对象唯一性呢? 思想: ...
随机推荐
- C#/.NET/.NET Core优秀项目和框架2025年1月简报
前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的详细介绍.功能特点.使用方式以及部分功能 ...
- [HAOI2018] 染色 题解
第一眼肯定想到容斥.设 \(G(k)\) 表示至少有 \(k\) 种颜色符合要求,\(F(k)\) 表示恰好有 \(k\) 种颜色符合要求.显然 \(k\) 的上界 \(t=\min(m,\lfloo ...
- const char*和char*的区别
- Thymeleaf 在页面中直接显示内容
Thymeleaf 在页面中直接显示内容 一般情况下 Thymeleaf 模板要输出变量需要在某个标签中(如<div>.<span>)写th:text等属性来实现.但有时我 ...
- C#(面向对象的托管语言)类库(区别于应用程序)的异常处理思路
1.不要做出任何应用程序才需要考虑抉择策略,不能想当然的决定一些错误情形.具体的一个体现形式是什么异常都捕获.这不是类库的职责,因为无法掌握所有的调用者的使用情形,这些不确定性是委托.虚方法.接口等特 ...
- Python基础-模块和面向对象-shutil、re、bs4、requests模块
概要: 模块 自定义模块(已经讲了) 内置模块 shutil re 正则表达式 第三方模块 requests 模块 bs4 模块 面向对象: 面向对象(Object-Oriented Programm ...
- php批量删除记录
<?php $arr = $_POST["item"]; $db = new mysqli("localhost","root",&q ...
- redmine 127访问成功,其他机器不能访问
添加防火墙 入站规则
- 【离线地图】地图瓦片css复杂滤镜线段绘制
需求: 目前已经对地图瓦片做了复杂滤镜的黑夜展示,现在又要在这个图片上绘制新的线段等内容,且不能被这个复杂滤镜影响,变成奇奇怪怪的颜色. 同时因为框架限制,只能在这个img上绘制 思考: 1.既然不想 ...
- CentOS7安装图形界面模式
0.9272019.03.24 15:17:05字数 865阅读 22,115 本人通过VMware14安装Centos7.6过程中出现蓝屏现象,最后发现是因为在系统安装图形界面过程中报错导致,所以决 ...