多线程代码案例 - 1
目录
单例模式
1. 饿汉模式
2. 懒汉模式
单例模式与多线程
问题1
问题2
问题3
完!
单例模式
单例模式是一种设计模式。
设计模式,是我们在编写代码时候的一种软性的规定,也就是说,我们遵守设计模式,代码的下限是有保证的。设计模式有很多种,在不同的语言中,也有不同的设计模式,设计模式也可以被认为是对编程语言语法的补充。
单例 ==》 即单个实例(对象),某个类,在一个进程中,只应该创建出一个实例(是原则上不应该有多个),使用单例模式,可以对我们的代码进行一个更为严格的校验和检查。
举个栗子:有的时候,代码中需要使用一个对象,来管理 / 持有大量的数据,此时有一个对象就可以了。比如,一个对象管理了 10G 的数据,如果我们不小心创建出多个对象,内存空间就会成倍的增长....
唯一的对象是如何保证的呢?我们可以选择“君子之约”的方式,即写一个文档,文档上约定,每个接手维护代码的程序员,都不能把这个类创建多个实例...(很显然,这种约定并不靠谱....)
我们期望让机器(编译器)能够对代码中的指定类,创建的实例个数进行检验。如果发现创建多个实例了,就直接编译报错的这种,如果能做到这一点,我们就可以放心的编写代码了,不会担心因为失误创建出多个实例...
Java 语法中,本身没有办法直接约定某个对象能创建几个实例....就需要一些技巧来实现这样的效果。
实现单例模式的方式有很多种,这里介绍最基础的两种实现方式:1. 饿汉模式 2. 懒汉模式
1. 饿汉模式
我们创建一个类,名为 Singleton 希望这个类在一个进程中,只能有唯一的实例
这个引用,就是我们期望创建出的唯一的实例的引用:
在这行代码中,使用 static 修饰,static 表示静态的,指的是“类属性”,instance 就是 Singleton 类对象里面持有的属性。(类对象是 Singleton.class 从 .class 文件加载到内存中,表示这个类的一个数据结构),每个类的累对象,只存在一个,类对象中的 static 属性,自然也是只有一个了。
因此 instance 指向的这个对象,就是唯一的一个对象。
其他代码要想使用这个类的实例,就需要通过这个方法来进行获取,不应该在其他代码中重新 new 这个对象,而是使用这个方法获取到线程的对象。
之后我们再添加一个无参的 private 的构造方法:
这样下来,就从根本上阻止了其他代码,使得其他代码没有办法 new,只能使用 getInstacne() 方法
上述代码,称为“饿汉模式”,是单例模式中一种简单的写法,所谓 “饿” 形容 "非常迫切",实例是在类加载的时候就创建了,创建的时机非常早,相当于程序一启动,实例就创建了,就使用“饿汉”形容“创建实例非常迫切,时机非常早”...
补充:上面的饿汉模式中,如果面对反射,是无能为力的,也就是说,反射可以再创建对象,但反射属于是非常规的编程手段,代码中随便使用反射是非常糟糕的....
2. 懒汉模式
“懒” 这个词,并不是贬义词,而是褒义词...社会能进步,科技能发展,效率生产力提高,可能部分原因还是因为“懒”。
举个栗子:洗碗。A 和 B 两个人吃饭,A 一般做的是,吃完饭,就立即去洗碗,吃一顿饭,用 4 个碗,就要洗 4 个碗。但是 B 就不一样了,B 在吃完饭之后,就把碗放到一边不管了,等到下次吃饭的时候,需要这个碗的时候,再来洗碗。
B 这种洗碗方式,其实能够提升效率。(不考虑卫生的前提下....)
比如,上一顿饭,用了 4 个碗,但是下一顿的时候,只需要使用 2 个碗,这个时候就只需要洗 2 个碗就可以了,另外 2 个碗还继续放着... --> 洗 2 个碗,比洗 4 个碗,更加高效!!!
在计算机中,”懒“的思想,就非常有意思。
比如有一个非常大的文件(10GB),使用编辑器打开这个文件,如果是按照”饿汉“的方式,编辑器就会先把这 10 GB 的数据都加载到内存中,然后再进行统一的展示...(但即使是加载了这么多数据,用户还是需要一点一点的看,没法一下子看完这么多)
如果是按照”懒汉“的方式,编辑器就会只读取一小部分数据(比如只读取 10KB),把这 10KB 先展示出来,然后随着用户进行翻页之类的操作,再继续读后面的数据...
加载 10GB 的时间会很长,加载 10KB 只是一瞬间的事情...
懒汉模式,区别于饿汉模式,是创建实例的时机不太一样了,创建实例的时机会更晚,直到第一次使用的时候,才会创建实例。
代码实现如下:
第一行代码中,仍然是引用指向的唯一实例,不过这个引用先初始化为 null,而不是立即去创建实例。如果是首次调用 getInstance 方法,那么此时 instance 引用为 null,就会进入 if 条件,从而把实例创建出来。如果是后续再次调用 getInstance,由于 instance 已经不再是 null 了,此时不会进入 if,就直接返回之前创建好的引用了。
这样设定,仍然可以保证,该类的实例是唯一一个,与此同时,创建实例的时机就不再是程序驱动了,而是当第一次调用 getInstance 的时候,才会创建。
而进行第一次调用 getInstance 这个操作的执行时机就不确定了,要看程序的实际需求,大概率要比饿汉这种方式要晚一些,甚至有可能整个程序压根用不到这个方法,也就把创建的操作给省下了。
有的程序,可能是根据一定的条件,来决定是否要进行某个操作,进一步来决定是否要创建实例...
单例模式与多线程
上面我们介绍的关于单例模式只是一个开始,接下来才是我们多线程的真正关键问题。
即:上述我们编写的饿汉模式和懒汉模式,是否是线程安全的?
对于饿汉模式来说,getInstance 直接返回 instance 这个实例,这个操作,本质上就是一个 读 的操作。如果在多线程中,多个线程读取同一个变量,是不是线程安全的?==》 是线程安全的!!!
再来看懒汉模式...在懒汉模式中,代码有读的操作(return instance),也有写的操作(instance = new SingletonLaze())。
问题1
因为多线程之间是随即调度,抢占式执行的,如果 t1 和 t2 按照下列的顺序来执行代码,就会出现问题。
如果是 t1 和 t2 按照上述情况来操作,就会导致实例被 new 了两次,这就不是单例模式了,不符合我们的预期,就有 bug 了。(单例模式的这个对象,可能是一个非常大的对象,可能这个对象要管理 10GB...)
那问题来了,如何改进懒汉模式,让其能够称为线程安全的代码呢? ==》 加锁,synchronized!!!
多线程代码其实是非常复杂的,代码稍微变化一些,结论就可能截然不同。
千万不可以认为,代码中写了 synchronized 就一定线程安全,不写 synchronized 线程就一定不安全,具体问题要具体分析,要分析这个代码在各种调度执行顺序下的不同情况,确保每种情况都不会出现 bug。
这里如果要想代码正确执行,是需要把 if 和 new 两个操作,打包成一个原子的。
多线程下情况:
如果把 synchronized 加在里面,还是无法解决问题,当出现上述情况,t2 仍然会创建一个实例,然后执行完线程,然后解锁,然后 t1 还是可以继续再创建一个实例,结果仍然会创建两个实例 ==》 更加合理的做法是,把 synchronized 套在 if 的外面。
多线程情况:
这种情况下,如果进行了随机调度,但 t2 是阻塞状态的,要等待到 t1 释放锁,这样下来,就可以确保,一定是 t1 执行完 new 操作,执行完修改 instance 之后,再回到 t2 执行 if 操作,此时 t2 的if 条件就不会成立了,t2 就会直接返回了。
问题2
但上述的代码,仍然是存在一些问题的。
如果 instance 已经创建过了,此时后续再调用 getInstance 方法就都是直接返回 instance 实例即可(此处的操作就是纯粹的读操作了,就不会有线程安全问题了),此时,针对这个没有线程安全的代码,仍然我们的上述代码每次调用前都是先加锁,再解锁,此时效率就非常低了!!!
加锁就意味着可能会产生阻塞,一旦线程阻塞,啥时候能解除,就不知道了...(只要一个代码里加了锁,一般和”高性能“就无缘了...) ==》在需要加锁的时候才加锁,不该加锁的时候,不要随便的加锁!!!
所以为了优化上述代码,我们可以再在锁的外面套上一层 if,判定一下这个代码是否需要加锁,如果需要加锁,就加,如果不需要加锁,就不要加...
如果 instance 为 null,则说明是首次使用,首次调用就需要考虑线程安全问题,就需要加锁。
如果 instance 不为 null,就说明是后续的调用,只有读的操作,就不需要加锁了。
上面的代码,有了两重完全相同的 if 判断,我们之前的代码并没有这样写过,是由于我们之前的代码,并不会涉及到阻塞,也不会涉及到多线程,在单线程 / 非阻塞 的代码中连续写两个相同的 if 是没有意义的...
但是在多线程 / 可能阻塞的代码中,这样的代码就是非常有意义的,看起来是两个一样的条件,实际上,两个条件的结果可能是相反的。
第一个 if 判定的是 是否要加锁!
第二个 if 判定的是 是否要创建对象!
巧合的是,两个 if 的条件相同,但是他们的作用是完全不同的,这样就实现了 线程安全 and 执行效率双重校验锁...
问题3
不巧的是,这个代码,仍然有一点问题。
指令重排序,引起的线程安全问题!!!指令重排序,也是编译器优化的一种方式。 ==》 调整原有代码的执行顺序,保证逻辑不变的前提下,提高程序的效率。
举个栗子:A 让 B 去买菜,菜单如下:西红柿,鸡蛋,黄瓜,茄子。
超市如图:
B 如果按照 A 菜单上的顺序去买:
显然是一波三折,那 B 如果对超市十分熟悉了,保证逻辑不变的前提下(买到四种菜),调整原有买菜的执行顺序,提高买菜的效率。显然按照下图的路线,会更快。
换回代码的视角:
上面的这行代码,其实可以拆成三个大的步骤(不是三个指令!!!)
1. 申请一段内存空间
2. 在这个内存上调用构造方法,创建出这个实例
3. 把这个内存地址赋给 instance 引用变量
正常情况下,上述的代码是按照 1 2 3 的顺序来执行的,但是编译器也可能会优化成 1 3 2 的顺序来执行的。无论是 1 2 3 还是 1 3 2,在单线程下,都是可以的。
1 就相当于买了一个房子
2 就相当于给房子装修
3 就相当于我们拿到房子的钥匙
1 2 3 拿到钥匙之后,就得到了装修好的房子,称为“精装房”, 1 3 2,先拿到要是,然后自己负责装修,称为“毛坯房”,我们买房子,上面两种情况都会发生。
但是,如果在多线程下,指令重排序,就可能引入问题了。
t1 按照 1 3 2 的方式来执行这里的 new 操作
上述代码中,由于 t1 线程执行完 1 3 之后,调度走,此时 instance 指向的是一个非 null 的,但是是未初始化的对象,此时 t2 线程判定 instance == null 不成立,就会直接 return,如果 t2 继续使用 instance 里面的属性或者方法,就会出现问题,引起代码的逻辑出现问题。
解决上述问题,核心思路还是我们前面提到的 volatile
volatile 有两个功能:
1. 保证内存可见性 ==》 每次访问变量必须都要重新读取内存,而不会优化到寄存器 / 缓存中
2. 禁止指令重排序 ==》 针对被 volatile 修饰的变量的读写操作的相关指令,是不能被重排序的
这个时候,针对这个变量的读写操作,就不会出现重排序了,此时的执行顺序就一定 1 2 3,也就杜绝了上述问题了!
完!
相关文章:
多线程代码案例 - 1
目录 单例模式 1. 饿汉模式 2. 懒汉模式 单例模式与多线程 问题1 问题2 问题3 完! 单例模式 单例模式是一种设计模式。 设计模式,是我们在编写代码时候的一种软性的规定,也就是说,我们遵守设计模式,代码的下限…...
Python网络爬虫:从入门到实践
目录 什么是网络爬虫? 网络爬虫的工作原理 常用Python爬虫库 编写爬虫的步骤 实战示例 注意事项与道德规范 未来趋势 1. 什么是网络爬虫? 网络爬虫(Web Crawler)是一种自动化程序,通过模拟人类浏览行为&#x…...
在线XML转义工具
XML转义是将XML的特定字符转换为转义符 在线XML转义工具...
GO语言学习(16)Gin后端框架
目录 ☀️前言 1.什么是前端?什么是后端?🌀 2.Gin框架介绍 🌷 3.Gin框架的基本使用 -Hello,World例子🌷 🌿入门示例 - Hello,World 💻补充(一些常用的网…...
GO语言 使用protobuf
1.什么是protobug,为什么要学它 protobuf是一种类似于json和xml的数据序列化格式 我们可能会存在这样的问题:不同语言之间真的没有办法互相传递数据吗?如果可以,那如果一个项目使用了多种语言有应该如何传递数据? 这…...
Golang的文件处理优化策略
Golang的文件处理优化策略 一、Golang的文件处理优化策略概述 是一门效率高、易于编程的编程语言,它的文件处理能力也非常强大。 在实际开发中,需要注意一些优化策略,以提高文件处理的效率和性能。 本文将介绍Golang中的文件处理优化策略&…...
Golang的文件同步与备份
Golang的文件同步与备份 一、Golang介绍 也称为Go语言,是谷歌开发的一种编程语言,具有高效的并发编程能力和出色的内存管理。由于其快速的编译速度和强大的标准库,Golang在网络应用、云平台和大数据等领域得到了广泛应用。 二、文件同步与备份…...
Go和Golang语言简介
李升伟 整理 Go 和 Golang 实际上指的是同一种编程语言,只是名称不同。 Go 名称:Go 是该编程语言的正式名称。 起源:由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 于 2007 年开始设计,2009 年正式发布。 设计目…...
spring boot集成reids的 RedisTemplate 序列化器详细对比(官方及非官方)
RedisTemplate 序列化器详细对比(官方及非官方) 1. 官方序列化器 (1) JdkSerializationRedisSerializer 特点: 基于 Java 原生序列化(Serializable)。支持复杂对象(需实现 Serializable 接口)…...
NLP高频面试题(三十二)——介绍一下CLIP和CLIP2
在人工智能领域,图像与文本的结合一直是研究的热点。近年来,OpenAI推出的CLIP模型,以及后续发展的CLIP2模型,在多模态学习方面取得了显著进展。本文将对这两个模型进行介绍,探讨它们的架构、训练方法和应用场景。 CLI…...
【FPGA】状态机思想回顾流水灯
【FPGA】状态机思想回顾流水灯 一、LED流水灯实现1. 基本要求2. 状态机思想3. 关键代码4. 仿真测试5. 效果演示 二、CPLD和FPGA1. 技术区别2. 应用场景 三、HDLbits组合逻辑题目四、实验总结 一、LED流水灯实现 1. 基本要求 用状态机思想写一个 LED流水灯的FPGA代码写出仿真测…...
Java——StringBuilder和StringBuffer
StringBuilder和StringBuffer 字符串的不可变性字符串修改StringBuilder和StringBuffer1 字符串拼接2 获取、修改和删除下标字符3 插入字符4 字符串替换5 字符串反转6 StringBuffer和StringBuilder类与String类的转换 StringBuffer和StringBuilder类的区别 前言 在Java中String…...
基于yolo11的BGA图像目标检测
1.产生图像数据的分辨率 2.产生图像的大小 3.产生图像是黑白或是RGB彩色 灰度图像,达到识别要求,减少计算量 4.标注数据的精准程度 1.模型标注后,少量标注全部人工校验,大量数据抽检,部分人工检验 2.明确边界框贴合…...
MongoDB 复制集实战
MongoDB 复制集实战 MongoDB 复制集架构 一、复制集核心原理 主从架构与数据冗余 复制集由主节点(Primary)和多个从节点(Secondary)构成,所有节点存储相同数据集副本。 主节点:唯一接受写操作的节点&…...
一个服务器算分布式吗,分布式需要几个服务器
一个服务器不构成分布式系统。分布式系统的核心在于多台独立的计算机(服务器)协同工作,通过通信网络共享资源、共同完成任务。以下是对问题的详细分析: 1. 单台服务器 ≠ 分布式 单台服务器的架构是集中式的,所有功能…...
k8s之Ingress讲解
一、Ingress基本介绍 Ingress是管理k8s外部访问(http/https)的API对象,提供应用层的路由功能,处理第七层(http/https)流量,支持基于域名、路径的路由。与service不同的是,service处理…...
centos-LLM+EmbeddingModel+VectorDB-简单模型
参考: Ollama平台里最流行的embedding模型: nomic-embed-text 模型介绍和实践-CSDN博客 https://blog.csdn.net/skywalk8163/article/details/145498041 https://docs.cherry-ai.com/knowledge-base/data Installation — Sentence Transformers docum…...
Uniapp 持续出现 Invalid Host/Origin header 解决方法
目录 前言1. 问题所示2. 原理分析前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 执行代码的时候,源源不断,一直持续出现这个 Invalid Host/Origin header [WDS]...
密码学基础——古典密码学
目录 一、定义 特点: 二、发展阶段 三、代换密码 1.单表代换密码 1.1恺撒密码 1.2 移位变换 1.3 仿射变换 2.多表代换密码 维吉尼亚密码 四、置换密码 栅栏密码 一、定义 古典密码学是指在现代密码学出现之前,使用较为简单的数学方法和手工…...
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
Java 连接 Redis 的驱动分类及对比 1. Jedis 类型:纯 Java 实现的 阻塞式(同步) 客户端特点: 基于阻塞 IO,每个连接一个线程,适合中小型应用。支持单机、哨兵模式、集群模式。使用简单,直接操作…...
人工智能之数学基础:基于吉文斯变换完成矩阵的QR分解
本文重点 在数值线性代数中,QR分解是将矩阵分解为一个正交矩阵(Q)和一个上三角矩阵(R)的重要方法。它在求解线性方程组、计算矩阵特征值及最小二乘问题中具有广泛应用。吉文斯变换(Givens Transformation)作为实现QR分解的核心工具之一,通过平面旋转变换逐步消去矩阵元…...
后端框架入门:Django
Django 基础:模型、视图、模板Django REST Framework 的使用一、Django 概述 Django 是一个 高效、灵活、可扩展 的 Python Web 框架,主要用于快速开发 Web 应用 和 REST API。 📌 Django 的优势: ✅ MTV 架构:模型(Model)、视图(View)、模板(Template)分离,便于…...
16变量命名风格
给变量/函数/文件/类 起名字, 非常有讲究的~~ 1.起的名字要有描述性.不要使用 abc,xyz 这种比较无规律的名字来描述 2.如果名字比较长,由多个单词构成的,就需要使用适当的方式来进行区分不同单词 C中,偏好使用_来进行单词的分割. 形如: student_count(变量) unordered_map(stl容…...
【自学笔记】jQuery语言基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 jQuery基础知识点总览1. jQuery简介2. jQuery选择器示例代码 3. jQuery事件示例代码 4. jQuery动画示例代码 5. jQuery Ajax示例代码 6. jQuery DOM操作示例代码 总…...
基于机器学习的三国时期诸葛亮北伐失败因素量化分析
一、研究背景与方法论 1.1 历史问题的数据化挑战 三国时期(220-280年)的战争史存在史料分散、数据缺失的特点。本研究通过构建包含军事、经济、地理、政治四大维度的结构化数据库,收录建安十二年(207年)至建兴十二年…...
读取excel作为第一列创建数据表,然后将值插入数据表
读取 Excel 文件。创建一个数据库表,其列名与 Excel 表格的列名相同。插入数据,对于每一行,如果数据为 #N/A,插入空值。 下面是一个 Python 示例代码,使用 pandas 读取 Excel 文件,创建数据库表࿰…...
14-SpringBoot3入门-MyBatis-Plus之CRUD
1、整合 13-SpringBoot3入门-整合MyBatis-Plus-CSDN博客 2、表 3、crud package com.sgu;import com.sgu.mapper.UserMapper; import com.sgu.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.spri…...
英语口语 -- 常用 1368 词汇
英语口语 -- 常用 1368 词汇 介绍常用单词List1 (96 个)时间类气候类自然类植物类动物类昆虫类其他生物地点类 List2 (95 个)机构类声音类食品类餐饮类蔬菜类水果类食材类饮料类营养类疾病类房屋类家具类服装类首饰类化妆品类 Lis…...
《汽车噪声控制》课程作业
作业内容 在MATLAB绘制给出单个正弦波或余弦波的时域图和频域图 绘制实测数据的时域图和频域图 图1 单个正弦波的时频图 图1 单个正弦波的时频图 % 正弦波参数设置 f0 1000; % 信号频率 1kHz Fs 16384; % 采样频率 16kHz T 0.05; % 信号持续时间 0.05秒 A 0.8; % 信号幅度…...
nginx的反向代理和负载均衡
http 协议反向代理 反向代理配置参数: proxy_pass;#用来设置将客户端请求转发给的后端服务器的主机 可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式 也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支…...
栈 —— 数据结构基础刷题路程
一、P1739 表达式括号匹配 - 洛谷 算法代码: #include<bits/stdc.h> using namespace std; const int N300008; struct mystack {int a[N];int t-1;//压栈void push(int data){a[t]data; } //取栈顶元素int top(){return a[t]; } //弹出栈顶元素void pop(){i…...
SQL语句(一)—— DDL
目录 一、SQL 基础知识 (一)SQL 通用语法 (二)SQL 分类 二、DDL —— 数据库操作 1、查询所有数据库 2、查询当前数据库 3、创建数据库 4、删除数据库 5、切换数据库 三、DDL —— 表操作 (一)查…...
ROS2 高级组件中的webots介绍
前言 这一篇文章主要是和大家分享一下关于ROS2 高级组件中的webots,会介绍关于webots的知识点,以及如何安装和测试环节,最后就是利用 webots 实现一个差速轮式机器人的运动仿真。 正文内容 webots 引入和学习资料 webots 是来自瑞士的 Cy…...
SvelteKit 最新中文文档教程(17)—— 仅服务端模块和快照
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...
Java 基础-29-final关键字-详解
在Java编程语言中,final是一个非常重要的关键字,它用于不同的上下文中以表示某些东西是不可变的。本文将详细介绍final关键字的各种用法和其应用场景。 1. final变量 当你将一个变量声明为final时,这意味着一旦给这个变量赋值后,…...
从数据透视到AI分析,用四层架构解决运维难题
在数字化转型的浪潮中,企业 IT 系统已从单一架构演变为多云、多设备、多应用的复杂生态。传统监控工具因覆盖不全、响应滞后、分析能力弱而逐渐失效。Site24x7 以“全栈覆盖 智能协同”为核心,构建了一套四层递进式监控架构,实现从基础设施到…...
大智慧前端面试题及参考答案
如何实现水平垂直居中? 在前端开发中,实现元素的水平垂直居中是一个常见的需求,以下是几种常见的实现方式: 使用绝对定位和负边距:将元素的position设置为absolute,然后通过top、left属性将其定位到父元素的中心位置,再使用负的margin值来调整元素自身的偏移,使其水平垂…...
PyQt学习记录
PyQt学习记录 要在界面上 创建一个控件,就需要在程序代码中 创建 这个 控件对应类 地一个 实例对象。 在Qt系统中,控件(widget)是 层层嵌套 的,除了最顶层的控件,其他的控件都有父控件。 几个函数 函数mo…...
人工智能赋能管理系统,如何实现智能化决策?
随着信息技术的飞速发展,人工智能(AI)已经成为推动各行各业变革的重要力量。在企业管理领域,人工智能技术的引入为管理系统的智能化决策提供了强有力的支持。本文将深入探讨人工智能如何赋能管理系统,实现智能化决策&a…...
【深度学习新浪潮】DeepSeek近期的技术进展及未来动向
一、近期技术进展 模型迭代与性能提升 DeepSeek-V3-0324版本更新:2025年3月24日发布,作为V3的小版本升级,参数规模达6850亿,采用混合专家(MoE)架构,激活参数370亿。其代码能力接近Claude 3.7,数学推理能力显著提升,且在开源社区(如Hugging Face)上线。DeepSeek-R1模…...
存储型XSS漏洞解析
一、存储型XSS漏洞的核心原理 定义与攻击流程 存储型XSS(Stored XSS)是一种将恶意脚本永久存储在服务器端(如数据库、文件系统)的跨站脚本攻击方式。其攻击流程分为四步: 注入阶段:攻击者通过输入点&…...
Python实现 MCP 客户端调用(高德地图 MCP 服务)查询天气工具示例
文章目录 MCP 官网GithubMCP 仓库简介架构高德地图 MCP 客户端示例python-sdk 客户端java-sdk 客户端 MCP 官网 https://modelcontextprotocol.io/introduction Github python-sdk:https://github.com/modelcontextprotocol/python-sdkjava-sdk:https…...
Flink介绍——实时计算核心论文之S4论文总结
PE对象的构成与功能 我们先来看下S4是怎么抽象流式计算的。 S4将所有的计算过程抽象为一个个Processing Element(处理元素)对象,简称为PE对象。 每一个PE对象,都有四部分组成,分别是: 功能(F…...
第二十四章:Python-folium库实现中国地图绘制
一、folium库简介 hchinamap库是一个专门用于绘制中国地图的R包,它通过与Highmaps图表库的结合,提供了一种简单的方式来绘制中国及其各省市自治区的地图。虽然hchinamap库是为R语言设计的,但在Python中也可以通过类似的库(如matpl…...
云巅之上:数字文明的重构与超越
序章:算力新纪元 2024年初春,当SpaceX的星舰将首批云计算节点送入近地轨道时,地球上的数字原住民们正通过云端AI助手规划着一天的行程。这场静默的革命已悄然进入新阶段——云计算不再只是工具,而是成为数字文明的"第六元素…...
蓝桥杯高频考点——高精度(含C++源码)
高精度 前言高精度加法例题思路及代码solution 1(初阶版 40分)solution 2(完全体 AC) 高精度乘法例题思路及代码solution 1(TLE 但是代码很清晰)solution 1的问题solution 2(优化 AC)…...
程序化广告行业(52/89):程序化创意深度剖析
程序化广告行业(52/89):程序化创意深度剖析 大家好!我一直对程序化广告领域充满热情,在学习过程中发现其中有很多有趣又实用的知识。今天写这篇博客,就是希望能和大家一起学习进步,深入探索程序…...
selenium和pytessarct提取古诗文网的验证码(python爬虫)
代码实现的主要功能: 浏览器自动化控制 验证码图像获取与处理 OCR验证码识别 表单自动填写与提交 登录状态验证 异常处理与资源清理 1. 浏览器初始化与页面加载 driver webdriver.Chrome() driver.get("https://www.gushiwen.cn/user/login.aspx?fro…...
封装可拖动弹窗(vue jquery引入到html的版本)
vue cli上简单的功能,在js上太难弄了,这个弹窗功能时常用到,保存起来备用吧 备注:deepseek这个人工智障写一堆有问题的我,还老服务器繁忙 效果图: html代码: <div class"modal-mask&qu…...
JavaScript重难点突破:期约与异步函数
同步和异步 同步(Synchronous) 定义:任务按顺序依次执行,前一个任务完成前,后续任务必须等待。 特点:阻塞性执行,程序逻辑直观,但效率较低 异步(Asynchron…...