设计模式——单例模式
单例模式
- 实现单例模式的方法
- 前置条件
- 懒汉式(Lazy Initialization)
- 饿汉式(Eager Initialization)
- 双重锁式(Double-Checked Locking)
- 静态内部类式(Static Inner Class)
- 枚举式(Enum)
- 总结
单例模式(Singleton Pattern)是软件工程中的一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。
实现单例模式的方法
前置条件
创建一个User类,模拟单例模式中创建对象使用。
public class User {private Integer id;private String name;private String password;public User() {}public User(Integer id, String name, String password) {this.id = id;this.name = name;this.password = password;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
懒汉式(Lazy Initialization)
单例模式中常见的模式之一,懒汉式可以做到使用单例对象时才创建对象,可以实现延迟加载,但是存在线程安全问题,需要通过synchronized关键字保证了线程安全,但会影响性能。
/*懒汉式 线程不安全 需要使用 synchronized*/
public class Lazy {private static User user;//没有synchronized关键字,线程不安全,多线程调用此方法时会创建不同地址值的User对象//对外提供接口public static synchronized User getUser() {if (user == null) {user = new User(1,"zhao","123456");}return user;}public static void main(String[] args) {//测试多线程下的懒汉式for (int i = 0; i < 10; i++) {new Thread(() -> {User user = getUser();System.out.println(user);}).start();}}
}
若没有添加synchronized关键字执行结果为:
会出现创建出多个对象的情况,背离了单例模式的初初衷。
添加synchronized关键字后可以保障对象的唯一性
饿汉式(Eager Initialization)
单例模式中常见的模式之一,饿汉式是在类加载时就创建实例比较简单,可以保证线程安全,但不支持延迟加载。
/*
* 饿汉式 线程安全
* */
public class Hungry {//类加载时就创建实例private static final User user = new User(1,"zhao","123456");//对外提供接口public static User getUser(){return user;}public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(() -> {User user = getUser();user.setId(2);System.out.println(user);}).start();}}
}
运行结果:
实现了单例模式
双重锁式(Double-Checked Locking)
双锁结构,优化懒汉式,为了提高性能同时保持线程安全性,可以采用双重检查锁定的方式。
volatile关键字: 是一种轻量级的同步机制,适用于那些不需要复杂同步逻辑的简单场景。如果应用需要更复杂的并发控制,那么应该考虑使用更高级的同步工具
优点:
1、可见性:
当一个线程修改了 volatile 变量的值,这个修改会立即对其他线程可见。
每次读取 volatile 变量时,都会直接从主内存中读取最新的值,而不是使用缓存中的旧值。
每次写入 volatile 变量时,都会立即将更新后的值写回主内存,确保其他线程可以看到最新的状态。
2、禁止指令重排序:
Java 编译器和处理器为了优化性能,可能会对指令进行重排序。然而,对于 volatile 变量的操作,编译器和运行时环境都必须遵守一定的规则,不能将 volatile 写操作放到读操作之后,也不能将 volatile 读操作放到写操作之前。这有助于维持程序的逻辑正确性。
缺点:
1、不保证原子性:
尽管 volatile 提供了可见性和有序性,但它并不提供原子性。这意味着如果对 volatile 变量执行复合操作(如 i++),这些操作仍然可能受到竞态条件的影响,因为它们不是原子性的。要确保原子性,可以考虑使用同步机制、Atomic 类或锁等方法。
synchronized 关键字: 是 Java 中用于实现线程同步的关键字,它能够确保在多线程环境中对共享资源的安全访问。
/*
双锁结构,优化懒汉式,为了提高性能同时保持线程安全性,可以采用双重检查锁定的方式。*/
public class DoubleChecked {// 使用volatile避免指令重排序,保证user的可见性private static volatile User user;//对外提供接口public static User getUser() {if (user == null) {synchronized (User.class) {if (user == null) {user = new User(1, "zhao", "123456");}}}return user;}public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(() -> {User user = getUser();System.out.println(user);}).start();}}
}
运行结果:
静态内部类式(Static Inner Class)
利用了Java语言的特性,只有当内部类被加载时才会创建单例实例,因此它是线程安全且延迟加载的。
静态内部类: 只有在它被显式使用时才会被加载,比如创建静态内部类的实例或者访问其静态成员。
/*
* 内部类 利用了Java语言的特性,只有当内部类被加载时才会创建单例实例,因此它是线程安全且延迟加载的。
*/
public class StaticInnerClass {//创建内部类:只有当内部类被加载时才会创建单例实例private static class GetUserInnerClass{private static final User user = new User(1,"zhao","123456");}//对外提供接口public static User getUser(){return GetUserInnerClass.user;}public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(() -> {User user = getUser();System.out.println(user);}).start();}}
}
运行结果:
枚举式(Enum)
枚举类型的单例模式之所以线程安全,主要是因为Java语言规范对枚举类型的初始化提供了保证,并且在多个方面限制了创建新实例的可能性。以下是具体的原因:
1. 类加载机制
Java的类加载器在加载类时是线程安全的。当一个类第一次被加载到JVM中时,类加载器会确保这个过程是原子性的,即同一时间只有一个线程可以执行类的加载和初始化。对于枚举类型来说,它的静态字段(包括枚举常量)是在类加载期间初始化的,这意味着所有枚举实例的创建都是在这个安全的过程中完成的。
2. 构造函数私有化
枚举类型的构造函数默认是私有的,这防止了外部代码通过new关键字来创建新的枚举实例。即使使用反射技术尝试调用私有构造函数,在Java 5及以上版本中,JVM也特别处理了这种情况,以确保无法通过反射创建额外的枚举实例。
3. 静态初始化块
枚举实例是通过静态初始化块创建的,而静态初始化块只会在类加载时执行一次,并且由JVM保证其线程安全性。由于枚举实例是静态成员变量的一部分,它们的初始化也是线程安全的。
4. 序列化机制
Java的序列化机制为枚举类型提供了特殊的支持。当试图反序列化一个枚举实例时,JVM不会创建一个新的对象,而是返回已经存在的枚举常量。如果有人尝试通过反序列化来创建新的枚举实例,JVM会抛出InvalidObjectException异常,从而防止了这种攻击。
5. 克隆保护
枚举类型还重写了Cloneable接口中的clone()方法,使其抛出CloneNotSupportedException异常。这阻止了通过克隆方式创建新的枚举实例。
6. 反射保护
如前所述,尽管反射可以用来访问私有构造函数或字段,但Java的反射API对枚举类型进行了特殊的处理,使得无法利用反射来创建新的枚举实例。
//枚举实现单例模式
//枚举类型本质上就是线程安全的,并且默认情况下是不可变和序列化的,非常适合用来实现单例模式。
public enum Enum {GETUSER;//枚举实现单例模式private User user;//构造方法私有化,创建user对象Enum() {user = new User(1,"zhao","123456");}//获取user对象public User getUser() {return user;}public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(() -> {Enum e = Enum.GETUSER;User user = e.getUser();System.out.println(user);}).start();}}
}
运行结果
总结
1. 饿汉式(Eager Initialization)
特点:类加载时即创建实例。
优点:线程安全,实现简单。
缺点:不支持延迟加载,可能浪费资源。
2. 懒汉式(Lazy Initialization)
特点:第一次调用 getInstance() 方法时才创建实例。
优点:支持延迟加载。
缺点:基本实现不是线程安全的;需要额外措施确保线程安全(如同步整个方法或使用双重检查锁定)。
3. 双重检查锁定(Double-Checked Locking)
特点:懒加载且线程安全,只在第一次创建实例时加锁。
优点:线程安全,支持延迟加载,性能较好。
缺点:实现稍微复杂一些。
4. 静态内部类(Static Inner Class)
特点:利用了Java语言特性,只有当静态内部类被加载时才会创建单例实例。
优点:线程安全,支持延迟加载,代码简洁。
缺点:相对不太直观。
5. 枚举(Enum)
特点:最简洁、最安全的方式,天然防止反射和序列化攻击。
优点:线程安全,支持延迟加载,代码非常简洁,防止反序列化攻击。
缺点:扩展性有限,不能继承其他类(只能实现接口)。
选择哪种方式?
1、如果你确定你的应用不会有多线程问题或者你不关心性能,那么饿汉式可能是最简单的解决方案。
2、如果你需要延迟加载并且希望保持线程安全,那么建议使用双重检查锁定、静态内部类或枚举的方式来实现懒汉式单例模式。
3、枚举类型的单例模式是实现单例模式的一个非常好的选择,特别是在你需要一种简单、线程安全并且能抵抗反射和序列化攻击的情况下。
相关文章:
设计模式——单例模式
单例模式 实现单例模式的方法前置条件懒汉式(Lazy Initialization)饿汉式(Eager Initialization)双重锁式(Double-Checked Locking)静态内部类式(Static Inner Class)枚举式…...
【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈
【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈 开发背景 优雅草央千澈所有的合集,系列文章可能是不太适合完全初学者的,因为课程不会非常细致的系统…...
docker一键安装脚本(docker安装)
第一种方法一键安装命令 curl -O --url http://luyuanbo79.south.takin.cc/wenjian/docker_install.sh && chmod x docker_install.sh && ./docker_install.sh 备用方法 curl -O --url https://file.gitcode.com/4555247/releases/untagger_0896d4789937405…...
Python的Matplotlib库应用(超详细教程)
目录 一、环境搭建 1.1 配置matplotlib库 1.2 配置seaborn库 1.3 配置Skimage库 二、二维图像 2.1 曲线(直线)可视化 2.2 曲线(虚线)可视化 2.3 直方图 2.4 阶梯图 三、三维图像 3.1 3D曲面图 3.2 3D散点图 3.3 3D散…...
VS Code的设置功能以及多层级的设置方式与解密
VS Code的Settings功能为用户提供了极大的灵活性和便利性,使得用户可以根据自己的需求和偏好来定制编辑器的行为和外观。 Settings 可以实现的具体功能 VS Code的设置项非常丰富,涵盖了各个方面,包括但不限于: 编辑器选项&…...
怎么理解编码器与解码器?
编码器和解码器是在信息处理、通信、多媒体等众多领域中广泛应用的两个概念,它们的作用相反但又紧密相关。下面从多个角度来帮助你理解这两个概念: 定义 编码器:编码器是一种将输入信息(如模拟信号、文本、图像、声音等…...
关于智能个人生活助手的一些想法
我感觉未来计算机发展 会变成钢铁侠的贾维斯那样, 每个人有自己的系统 集成ai和其他功能 助力生活和工作 说一下我为什么有这样的想法: 1.ai发展迅猛: 近些年来ai的发展势头越来越猛,不断破圈,越来越多的人了解到ai的强大,并使用ai改变了自己原有的生活或工作方式,熟练使用…...
FFmpeg音视频流媒体,视频编解码性能优化
你是不是也有过这样一个疑问:视频如何从一个简单的文件变成你手机上快速播放的短片,或者是那种占满大屏幕的超高清大片?它背后的法宝,离不开一个神奇的工具——FFmpeg!说它强大,完全不为过,它在…...
页面滚动下拉时,元素变为fixed浮动,上拉到顶部时恢复原状,js代码以视频示例
页面滚动下拉时,元素变为fixed浮动js代码 以视频示例 <style>video{width:100%;height:auto}.div2,#float1{position:fixed;_position:absolute;top:45px;right:0; z-index:250;}button{float:right;display:block;margin:5px} </style><section id"abou…...
Python玩转视频剪辑 - Opencv、Moviepy(附完整案例)
1. 准备工作 1.1 安装Opencv-python、Moviepy pip install opencv-python pip install moviepy 1.2 视频剪辑目标 如图,作者从b站下载了两个视频(仅做代码测试用,不作转载等任何商业用途),一个是刘初寻的疏远(以下简称视频一&a…...
Pulsar客户端如何控制内存使用
Pulsar客户端如何控制内存使用 一、使用场景 在实际应用中,Pulsar客户端的内存使用控制是一个重要的性能优化点。假设有一个搜索类业务需要记录用户搜索请求,以便后续分析搜索热点和优化搜索效果。以下是一个简化的代码示例: PulsarClient…...
接口测试总结(http与rpc)
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传…...
Linux:进程概念(二.查看进程、父进程与子进程、进程状态详解)
目录 1. 查看进程 1.1 准备工作 1.2 指令:ps—显示当前系统中运行的进程信息 1.3 查看进程属性 1.4 通过 /proc 系统文件夹看进程 2. 父进程与子进程 2.1 介绍 2.2 getpid() \getppid() 2.3 fork()函数—通过系统调用创建进程 fork()函数疑问 3. 进程状态…...
ubuntu22.04 编译安装libvirt 10.x
环境安装 sudo apt-get update -y sudo apt-get install qemu-system-x86 bridge-utils libyajl-dev -y sudo apt-get install build-essential autoconf automake libtool -y sudo apt-get install libxml2-dev libxslt1-dev libgnutls28-dev libpciaccess-dev libnl-3-de…...
Ubuntu 下载安装 Consul1.17.1
下载 来到 Consul 的下载页面:https://developer.hashicorp.com/consul/install?product_intentconsul 上面标注的地方可以切换你想要的版本,复制下载链接,使用 wget 下载这个文件: wget https://releases.hashicorp.com/consu…...
怎么实现Redis的高可用?
大家好,我是锋哥。今天分享关于【怎么实现Redis的高可用?】面试题。希望对大家有帮助; 怎么实现Redis的高可用? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 为了实现 Redis 的高可用性,我们需要保证在发…...
Domain Adaptation(李宏毅)机器学习 2023 Spring HW11 (Boss Baseline)
1. 领域适配简介 领域适配是一种迁移学习方法,适用于源领域和目标领域数据分布不同但学习任务相同的情况。具体而言,我们在源领域(通常有大量标注数据)训练一个模型,并希望将其应用于目标领域(通常只有少量或没有标注数据)。然而,由于这两个领域的数据分布不同,模型在…...
Chatper 4: mplementing a GPT model from Scratch To Generate Text
4 Implementing a GPT model from Scratch To Generate Text 本章节包含 编写一个类似于GPT的大型语言模型(LLM),这个模型可以被训练来生成类似人类的文本。Normalizing layer activations to stabilize neural network training在深度神经网…...
websocket股票行情接口
股票行情区别 交易所出来的数据,不管通过什么渠道,延时一般都不会差太远,估计一般也就几十ms的差别。 但是如果是通过http轮询,不太可能几十ms全部轮询一次。所以,做量化的话,用http协议是最次的选择。 …...
一键部署Netdata系统无需公网IP轻松实现本地服务器的可视化监控
文章目录 前言1.关于Netdata2.本地部署Netdata3.使用Netdata4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Netdata公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…...
概率图模型01
机器学习中,线性回归、树、集成和概率图都属于典型的统计学习方法,概率图模型会更深入地体现出‘统计’两字 概率图模型的常见算法 概率图模型中的图 概率图模型如图主要分为两种,即贝叶斯网络和马尔可夫网络,有向图与无向图&…...
oxml中创建CT_Document类
概述 本文基于python-docx源码,详细记录CT_Document类创建的过程,以此来加深对Python中元类、以及CT_Document元素类的认识。 元类简介 元类(MetaClass)是Python中的高级特性。元类是什么呢?Python是面向对象编程…...
YARN 集群
一、集群角色 1.1 概述 Apache Hadoop YARN是一个标准的Master/Slave集群(主从架构)。其中ResourceManager(RM) 为Master, NodeManager(NM) 为 Slave。常见的是一主多从集群,也可以…...
电机控制的数字化升级:基于DSP和FPGA的仿真与实现
数字信号处理器(DSP,Digital Signal Processor)在工业自动化领域的应用日益广泛。DSP是一种专门用于将模拟信号转换成数字信号并进行处理的技术,能够实现信号的数字滤波、重构、调制和解调等多项功能,确保信号处理的精…...
homework 2025.01.11 math 6
homework 2025.01.11 math 6 小学6年级数学...
【会话详解】
会话详解 概述 会话: 用户通过浏览器访问多个Web资源的过程,从打开浏览器开始访问特定网站,直到关闭浏览器的过程称为会话(Session)。会话管理是Web应用中跟踪和存储用户状态的重要机制。 有状态会话: …...
Unity 的 Vector3 与 Babylon.js 的 Vector3:使用上的异同
在 3D 开发中,向量是不可或缺的数学工具,用于表示位置、方向、速度等物理量。Unity 和 Babylon.js 都提供了 Vector3 类来处理三维向量,但它们在实现和使用上有一些异同。本文将详细对比 Unity 的 Vector3 和 Babylon.js 的 Vector…...
【2024年华为OD机试】(A卷,100分)- 单词倒序(Java JS PythonC/C++)
一、问题描述 题目描述 输入单行英文句子,里面包含英文字母,空格以及,.?三种标点符号,请将句子内每个单词进行倒序,并输出倒序后的语句。 输入描述 输入字符串S,S的长度 1 ≤ N ≤ 100 输出描述 输出倒序后的字…...
芯片:CPU和GPU有什么区别?
CPU(中央处理器)和GPU(图形处理单元)是计算机系统中两种非常重要的处理器,它们各自有不同的设计理念、架构特点以及应用领域。下面是它们之间的一些主要差异: 1. 设计目的与应用领域 CPU:设计…...
springboot整合mysql
1.首先在pom.xml中添加依赖: <!-- MySQL Driver --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- Druid连接池 -->…...
复合机器人助力手机壳cnc加工向自动化升级
在当今竞争激烈的制造业领域,如何提高生产效率、降低成本、提升产品质量,成为众多企业面临的关键挑战。尤其是在手机壳 CNC 加工这一细分行业,随着市场需求的持续增长,对生产效能的要求愈发严苛。而复合机器人的出现,正…...
深入浅出负载均衡:理解其原理并选择最适合你的实现方式
负载均衡是一种在多个计算资源(如服务器、CPU核心、网络链接等)之间分配工作负载的技术,旨在优化资源利用率、提高系统吞吐量和降低响应时间。负载均衡的实现方式多种多样,以下是几种常见的实现方式: 1. 硬件负载均衡&…...
征程 6X release版本内核模块安全加载
1.概述 征程 6X 系统在 release 编译时支持内核模块签名验证,仅加载使用正确密钥进行数字签名的内核模块。禁止加载未签名的内核模块或使用错误密钥签名的内核模块,客户需要替换成自己的 key 进行签名。 模块签名启用后,Linux 内核将仅加载…...
uni-app的学习
uni-app 有着跨平台支持、丰富的插件和生态系统、高性能、集成开发工具HBuilderX的配合使用。允许使用者仅通过一套代码发布到多平台使用。 uni-app官网 uni-app 是一个适合开发跨平台移动应用和小程序的框架,能够大幅提高开发效率。 一、了解 1.1 工具准备 从Git…...
国产信创实践(国能磐石服务器操作系统CEOS +东方通TongHttpServer)
替换介绍: 国能磐石服务器操作系统CEOS 对标 Linux 服务器操作系统(Ubuntu, CentOS) 东方通TongHttpServer 对标 Nginx 负载均衡Web服务器 第一步: 服务器安装CEOS映像文件,可直接安装,本文采用使用VMware …...
前端实时显示当前在线人数的实现
实时显示当前在线人数的实现 本文档提供了在网页上实时显示当前在线人数的多种实现方法,包括使用 WebSocket 实现实时更新和轮询方式实现非实时更新。 方法一:使用 WebSocket 实现实时更新 服务器端设置 通过 Node.js 和 WebSocket 库(如 …...
为AI聊天工具添加一个知识系统 之27 支持边缘计算设备的资源存储库及管理器
本文问题 现在我们回到 ONE/TWO/TREE 的资源存储库 的设计--用来指导 足以 支持 本项目(为AI聊天工具增加一套知识系统)的 核心能力 “语言处理” 中 最高难度系数的“自然语言处理” 中最具挑战性的“含糊性” 问题的解决。--因为足以解决 自然语言中最…...
继续坚持与共勉
经过期末考试后,又要开始学习啦。 当时一直在刷算法题就很少写博客了,现在要继续坚持写博客,将每天对于题的感悟记录下来。 同时我将会在学习Linux操作系统,对于过去学习的内容进行回顾!! 在此ÿ…...
PHP的扩展Imagick的安装
windows下的安装 下载:Imagick扩展 PECL :: Package :: imagick 3.7.0 for Windows 下载:ghostscript(PDF提取图片时用到,不处理PDF可以不安装) Ghostscript : Downloads 安装扩展 Imagick解压后&…...
【2024年华为OD机试】 (A卷,100分)- 租车骑绿岛(Java JS PythonC/C++)
一、问题描述 题目描述 部门组织绿岛骑行团建活动。租用公共双人自行车,每辆自行车最多坐两人,最大载重 M。 给出部门每个人的体重,请问最多需要租用多少双人自行车。 输入描述 第一行两个数字 m、n,分别代表自行车限重&#…...
Solidity入门: 函数
函数 Solidity语言的函数非常灵活,可以进行各种复杂操作。在本教程中,我们将会概述函数的基础概念,并通过一些示例演示如何使用函数。 我们先看一下 Solidity 中函数的形式: function <function name>(<parameter types>) {in…...
1、docker概念和基本使用命令
docker概念 微服务:不再是以完整的物理机为基础的服务软件,而是借助于宿主机的性能。以小量的形式,单独部署的应用。 docker:是一个开源的应用容器引擎,基于go语言开发的,使用时apache2.0的协议。docker是…...
【Python】深入Python元类:动态生成类与对象的艺术
在Python中,元类(Metaclass)是一个强大且高级的特性,允许开发者在类创建时控制其行为与属性。通过元类,开发者可以动态生成类和对象,实现自定义的类行为,进而增强代码的灵活性和可扩展性。本文将…...
数字孪生可视化在各个行业的应用场景
数字孪生技术,作为新一代信息技术的集大成者,正在深刻改变着我们对物理世界的认知和管理方式。本文将探讨数字孪生可视化在不同行业的应用场景,以及它们如何赋能行业数字化转型。 1. 智慧城市与交通 在智慧城市领域,数字孪生技术…...
CES Asia 2025科技盛宴,AI智能体成焦点
2025第七届亚洲消费电子技术展(CES Asia赛逸展)将在北京拉开帷幕,AI智能体有望成为展会的核心亮点。 深圳市人工智能行业协会发文表示全力支持CES Asia 2025(赛逸展),称其为人工智能领域的创新发展提供了强…...
【第04阶段-机器学习深度学习篇-1-深度学习基础-深度学习介绍】
1 深度学习概念 深度学习是基于机器学习延伸出来的一个新的领域,由以人大脑结构为启发的神经网络算法为起源加之模型结构深度的增加发展,并伴随大数据和计算能力的提高而产生的一系列新的算法。 2 深度学习发展 其概念由著名科学家Geoffrey Hinton等人…...
android framework.jar 在应用中使用
在开发APP中,有时会使用系统提供的framework.jar 来替代 android.jar, 在gradle中配置如下: 放置framework.jar 依赖配置 3 优先级配置 gradle.projectsEvaluated {tasks.withType(JavaCompile) {Set<File> fileSet options.bootstrapClasspat…...
带格式 pdf 翻译
支持 openAI 接口,国内 deepseek 接口兼容 openAI 接口, deepseek api 又非常便宜 https://pdf2zh.com/ https://github.com/Byaidu/PDFMathTranslate...
Flutter项目适配鸿蒙
Flutter项目适配鸿蒙 前言Flutter项目适配鸿蒙新工程直接支持ohos构建新项目编译运行 适配已有的Flutter项目 前言 目前市面上使用Flutter技术站的app不在少数,对于Flutter的项目,可能更多的是想直接兼容Harmonyos,而不是直接在重新开发一个…...
轻量自高斯注意力机制LSGAttention模型详解及代码复现
模型背景 近年来,卷积神经网络(CNN)在高光谱图像分类领域取得了显著进展。然而,CNN面临 长距离关系建模 和 计算成本 增加的挑战。为解决这些问题,研究人员提出了基于 轻量自高斯注意(Light Self-Gaussian-Attention, LSGA) 机制的视觉转换器(Vision Transformer, VIT),旨…...