反制面试官 | 14张原理图 | 再也不怕被问 volatile!

悟空 爱学习的程序猿,自主开发了Java学习平台、PMP刷题小程序。目前主修Java、多线程、SpringBoot、SpringCloud、k8s。本公众号不限于分享技术,也会分享工具的使用、人生感悟、读书总结。

絮叨

这一篇也算是Java并发编程的开篇,看了很多资料,但是轮到自己去整理去总结的时候,发现还是要多看几遍资料才能完全理解。还有一个很重要的点就是,画图是加深印象和检验自己是否理解的一个非常好的方法。

一、Volatile怎么念?

volatile怎么念

看到这个单词一直不知道怎么发音

英 [ˈvɒlətaɪl]  美 [ˈvɑːlətl]​adj. [化学] 挥发性的;不稳定的;爆炸性的;反复无常的

那Java中volatile又是干啥的呢?

二、Java中volatile用来干啥?

  • Volatile是Java虚拟机提供的轻量级的同步机制(三大特性)

    • 保证可见性

    • 不保证原子性

    • 禁止指令重排

要理解三大特性,就必须知道Java内存模型(JMM),那JMM又是什么呢?

volatile怎么念

三、JMM又是啥?

这是一份精心总结的Java内存模型思维导图,拿去不谢。

拿走不谢

原理图1-Java内存模型

3.1 为什么需要Java内存模型?

Why:屏蔽各种硬件和操作系统的内存访问差异

JMM是Java内存模型,也就是Java Memory Model,简称JMM,本身是一种抽象的概念,实际上并不存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。

3.2 到底什么是Java内存模型?

  • 1.定义程序中各种变量的访问规则

  • 2.把变量值存储到内存的底层细节

  • 3.从内存中取出变量值的底层细节

3.3 Java内存模型的两大内存是啥?

原理图2-两大内存

原理图1-Java内存模型

 

 

  • 主内存

    • Java堆中对象实例数据部分

    • 对应于物理硬件的内存

  • 工作内存

    • Java栈中的部分区域

    • 优先存储于寄存器和高速缓存

3.4 Java内存模型是怎么做的?

Java内存模型的几个规范:

  • 1.所有变量存储在主内存

  • 2.主内存是虚拟机内存的一部分

  • 3.每条线程有自己的工作内存

  • 4.线程的工作内存保存变量的主内存副本

  • 5.线程对变量的操作必须在工作内存中进行

  • 6.不同线程之间无法直接访问对方工作内存中的变量

  • 7.线程间变量值的传递均需要通过主内存来完成

由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写会主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副本拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成,其简要访问过程:

原理图3-Java内存模型

3.5 Java内存模型的三大特性

  • 可见性(当一个线程修改了共享变量的值时,其他线程能够立即得知这个修改)

  • 原子性(一个操作或一系列操作是不可分割的,要么同时成功,要么同时失败)

  • 有序性(变量赋值操作的顺序与程序代码中的执行顺序一致)

关于有序性:如果在本线程内观察,所有的操作都是有序的;如果在一个线程中观察另一个线程,所有的操作都是无序的。前半句是指“线程内似表现为串行的语义”(Within-Thread As-If-Serial Semantics),后半句是指“指令重排序”现象和“工作内存与主内存同步延迟”现象。

四、能给个示例说下怎么用volatile的吗?

考虑一下这种场景:

有一个对象的字段number初始化值=0,另外这个对象有一个公共方法setNumberTo100()可以设置number = 100,当主线程通过子线程来调用setNumberTo100()后,主线程是否知道number值变了呢?

答案:如果没有使用volatile来定义number变量,则主线程不知道子线程更新了number的值。

(1)定义如上述所说的对象:ShareData

class ShareData {int number = 0;​public void setNumberTo100() {this.number = 100;}}

(2)主线程中初始化一个子线程,名字叫做子线程

子线程先休眠3s,然后设置number=100。主线程不断检测的number值是否等于0,如果不等于0,则退出主线程。

public class volatileVisibility {public static void main(String[] args) {// 资源类ShareData shareData = new ShareData();​// 子线程 实现了Runnable接口的,lambda表达式new Thread(() -> {​System.out.println(Thread.currentThread().getName() + "\t come in");​// 线程睡眠3秒,假设在进行运算try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}// 修改number的值myData.setNumberTo100();​// 输出修改后的值System.out.println(Thread.currentThread().getName() + "\t update number value:" + myData.number);​}, "子线程").start();​while(myData.number == 0) {// main线程就一直在这里等待循环,直到number的值不等于零}​// 按道理这个值是不可能打印出来的,因为主线程运行的时候,number的值为0,所以一直在循环// 如果能输出这句话,说明子线程在睡眠3秒后,更新的number的值,重新写入到主内存,并被main线程感知到了System.out.println(Thread.currentThread().getName() + "\t 主线程感知到了 number 不等于 0");​/*** 最后输出结果:* 子线程     come in* 子线程     update number value:100* 最后线程没有停止,并行没有输出"主线程知道了 number 不等于0"这句话,说明没有用volatile修饰的变量,变量的更新是不可见的*/}}

没有使用volatile

(3)我们用volatile修饰变量number

class ShareData {//volatile 修饰的关键字,是为了增加多个线程之间的可见性,只要有一个线程修改了内存中的值,其它线程也能马上感知volatile int number = 0;​public void setNumberTo100() {this.number = 100;}}

输出结果:

子线程  come in子线程  update number value:100main     主线程知道了 number 不等于 0​Process finished with exit code 0

mark

 

小结:说明用volatile修饰的变量,当某线程更新变量后,其他线程也能感知到。

五、那为什么其他线程能感知到变量更新?

mark

其实这里就是用到了“窥探(snooping)”协议。在说“窥探(snooping)”协议之前,首先谈谈缓存一致性的问题。

5.1 缓存一致性

当多个CPU持有的缓存都来自同一个主内存的拷贝,当有其他CPU偷偷改了这个主内存数据后,其他CPU并不知道,那拷贝的内存将会和主内存不一致,这就是缓存不一致。那我们如何来保证缓存一致呢?这里就需要操作系统来共同制定一个同步规则来保证,而这个规则就有MESI协议。

如下图所示,CPU2 偷偷将num修改为2,内存中num也被修改为2,但是CPU1和CPU3并不知道num值变了。

原理图4-缓存一致性1

5.2 MESI

当CPU写数据时,如果发现操作的变量是共享变量,即在其它CPU中也存在该变量的副本,系统会发出信号通知其它CPU将该内存变量的缓存行设置为无效。如下图所示,CPU1和CPU3 中num=1已经失效了。

原理图5-缓存一致性2

当其它CPU读取这个变量的时,发现自己缓存该变量的缓存行是无效的,那么它就会从内存中重新读取。

如下图所示,CPU1和CPU3发现缓存的num值失效了,就重新从内存读取,num值更新为2。

原理图6-缓存一致性3

5.3 总线嗅探

那其他CPU是怎么知道要将缓存更新为失效的呢?这里是用到了总线嗅探技术。

每个CPU不断嗅探总线上传播的数据来检查自己缓存值是否过期了,如果处理器发现自己的缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置为无效状态,当处理器对这个数据进行修改操作的时候,会重新从内存中把数据读取到处理器缓存中。

原理图7-缓存一致性4

5.4 总线风暴

总线嗅探技术有哪些缺点?

由于MESI缓存一致性协议,需要不断对主线进行内存嗅探,大量的交互会导致总线带宽达到峰值。因此不要滥用volatile,可以用锁来替代,看场景啦~

六、能演示下volatile为什么不保证原子性吗?

原子性:一个操作或一系列操作是不可分割的,要么同时成功,要么同时失败。

这个定义和volatile啥关系呀,完全不能理解呀?Show me the code!

考虑一下这种场景:

当20个线程同时给number自增1,执行1000次以后,number的值为多少呢?

在单线程的场景,答案是20000,如果是多线程的场景下呢?答案是可能是20000,但很多情况下都是小于20000。

示例代码:

package com.jackson0714.passjava.threads;​/**演示volatile 不保证原子性* @create: 2020-08-13 09:53*/​public class VolatileAtomicity {public static volatile int number = 0;​public static void increase() {number++;}​public static void main(String[] args) {​for (int i = 0; i < 50; i++) {new Thread(() -> {for (int j = 0; j < 1000; j++) {increase();}}, String.valueOf(i)).start();}​// 当所有累加线程都结束while(Thread.activeCount() > 2) {Thread.yield();}​System.out.println(number);}}

执行结果:第一次19144,第二次20000,第三次19378。

volatile第一次执行结果

volatile第二次执行结果

volatile第三次执行结果

我们来分析一下increase()方法,通过反编译工具javap得到如下汇编代码:

public static void increase();Code:0: getstatic     #2                  // Field number:I3: iconst_14: iadd5: putstatic     #2                  // Field number:I8: return

number++其实执行了3条指令

getstatic:拿number的原始值 iadd:进行加1操作 putfield:把加1后的值写回

执行了getstatic指令number的值取到操作栈顶时,volatile关键字保证了number的值在此时是正确的,但是在执行iconst_1、iadd这些指令的时候,其他线程可能已经把number的值改变了,而操作栈顶的值就变成了过期的数据,所以putstatic指令执行后就可能把较小的number值同步回主内存之中。

总结如下:

在执行number++这行代码时,即使使用volatile修饰number变量,在执行期间,还是有可能被其他线程修改,没有保证原子性。

七、怎么保证输出结果是20000呢?

7.1 synchronized同步代码块

我们可以通过使用synchronized同步代码块来保证原子性。从而使结果等于20000

public synchronized static void increase() {number++;}

synchronized同步代码块执行结果

但是使用synchronized太重了,会造成阻塞,只有一个线程能进入到这个方法。我们可以使用Java并发包(JUC)中的AtomicInterger工具包。

7.2 AtomicInterger原子性操作

我们来看看AtomicInterger原子自增的方法getAndIncrement()

AtomicInterger

public static AtomicInteger atomicInteger = new AtomicInteger();​public static void main(String[] args) {​for (int i = 0; i < 20; i++) {new Thread(() -> {for (int j = 0; j < 1000; j++) {atomicInteger.getAndIncrement();}}, String.valueOf(i)).start();}​// 当所有累加线程都结束while(Thread.activeCount() > 2) {Thread.yield();}​System.out.println(atomicInteger);}

多次运行的结果都是20000。

getAndIncrement的执行结果

 

八、禁止指令重排又是啥?

说到指令重排就得知道为什么要重排,有哪几种重排。

如下图所示,指令执行顺序是按照1>2>3>4的顺序,经过重排后,执行顺序更新为指令3->4->2->1。

原理图8-指令重排

会不会感觉到重排把指令顺序都打乱了,这样好吗?

可以回想下小学时候的数学题:2+3-5=?,如果把运算顺序改为3-5+2=?,结果也是一样的。所以指令重排是要保证单线程下程序结果不变的情况下做重排。

8.1 为什么要重排

计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。

8.2 有哪几种重排

  • 1.编译器优化重排:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。

  • 2.指令级的并行重排:现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。

  • 3.内存系统的重排:由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

原理图9-三种重排

注意:

  • 单线程环境里面确保最终执行结果和代码顺序的结果一致

  • 处理器在进行重排序时,必须要考虑指令之间的数据依赖性

  • 多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。

8.3 举个例子来说说多线程中的指令重排?

设想一下这种场景:定义了变量num=0和变量flag=false,线程1调用初始化函数init()执行后,线程调用add()方法,当另外线程判断flag=true后,执行num+100操作,那么我们预期的结果是num会等于101,但因为有指令重排的可能,num=1和flag=true执行顺序可能会颠倒,以至于num可能等于100

public class VolatileResort {static int num = 0;static boolean flag = false;public static void init() {num= 1;flag = true;}public static void add() {if (flag) {num = num + 5;System.out.println("num:" + num);}}public static void main(String[] args) {init();new Thread(() -> {add();},"子线程").start();}}​

先看线程1中指令重排:

num= 1;flag = true; 的执行顺序变为flag=true;num = 1;,如下图所示的时序图

原理图10-线程1指令重排

如果线程2 num=num+5 在线程1设置num=1之前执行,那么线程2的num变量值为5。如下图所示的时序图。

原理图11-线程2在num=1之前执行

8.4 volatile怎么实现禁止指令重排?

我们使用volatile定义flag变量:

static volatile boolean flag = false;

如何实现禁止指令重排:

原理:在volatile生成的指令序列前后插入内存屏障(Memory Barries)来禁止处理器重排序。

有如下四种内存屏障:

四种内存屏障

volatile写的场景如何插入内存屏障:

  • 在每个volatile写操作的前面插入一个StoreStore屏障(写-写 屏障)。

  • 在每个volatile写操作的后面插入一个StoreLoad屏障(写-读 屏障)。

原理图12-volatile写的场景如何插入内存屏障

StoreStore屏障可以保证在volatile写(flag赋值操作flag=true)之前,其前面的所有普通写(num的赋值操作num=1) 操作已经对任意处理器可见了,保障所有普通写在volatile写之前刷新到主内存。

volatile读场景如何插入内存屏障:

  • 在每个volatile读操作的后面插入一个LoadLoad屏障(读-读 屏障)。

  • 在每个volatile读操作的后面插入一个LoadStore屏障(读-写 屏障)。

原理图13-volatile读场景如何插入内存屏障

LoadStore屏障可以保证其后面的所有普通写(num的赋值操作num=num+5) 操作必须在volatile读(if(flag))之后执行。

十、volatile常见应用

这里举一个应用,双重检测锁定的单例模式

package com.jackson0714.passjava.threads;/**演示volatile 单例模式应用(双边检测)* @author: 悟空聊架构* @create: 2020-08-17*/​class VolatileSingleton {private static VolatileSingleton instance = null;private VolatileSingleton() {System.out.println(Thread.currentThread().getName() + "\t 我是构造方法SingletonDemo");}public static VolatileSingleton getInstance() {// 第一重检测if(instance == null) {// 锁定代码块synchronized (VolatileSingleton.class) {// 第二重检测if(instance == null) {// 实例化对象instance = new VolatileSingleton();}}}return instance;}}

代码看起来没有问题,但是 instance = new VolatileSingleton();其实可以看作三条伪代码:

memory = allocate(); // 1、分配对象内存空间instance(memory); // 2、初始化对象instance = memory; // 3、设置instance指向刚刚分配的内存地址,此时instance != null

步骤2 和 步骤3之间不存在 数据依赖关系,而且无论重排前 还是重排后,程序的执行结果在单线程中并没有改变,因此这种重排优化是允许的。

memory = allocate(); // 1、分配对象内存空间instance = memory; // 3、设置instance指向刚刚分配的内存地址,此时instance != null,但是对象还没有初始化完成instance(memory); // 2、初始化对象

如果另外一个线程执行:if(instance == null)时,则返回刚刚分配的内存地址,但是对象还没有初始化完成,拿到的instance是个假的。如下图所示:

原理图14-双重检锁存在的并发问题

解决方案:定义instance为volatile变量

private static volatile VolatileSingleton instance = null;

十一、volatile都不保证原子性,为啥我们还要用它?

奇怪的是,volatile都不保证原子性,为啥我们还要用它?

volatile是轻量级的同步机制,对性能的影响比synchronized小。

典型的用法:检查某个状态标记以判断是否退出循环。

比如线程试图通过类似于数绵羊的传统方法进入休眠状态,为了使这个示例能正确执行,asleep必须为volatile变量。否则,当asleep被另一个线程修改时,执行判断的线程却发现不了。

那为什么我们不直接用synchorized,lock锁?它们既可以保证可见性,又可以保证原子性为何不用呢?

因为synchorized和lock是排他锁(悲观锁),如果有多个线程需要访问这个变量,将会发生竞争,只有一个线程可以访问这个变量,其他线程被阻塞了,会影响程序的性能。

注意:当且仅当满足以下所有条件时,才应该用volatile变量

  • 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。

  • 该变量不会与其他的状态一起纳入不变性条件中。

  • 在访问变量时不需要加锁。

十二、volatile和synchronzied的区别

  • volatile只能修饰实例变量和类变量,synchronized可以修饰方法和代码块。

  • volatile不保证原子性,而synchronized保证原子性

  • volatile 不会造成阻塞,而synchronized可能会造成阻塞

  • volatile 轻量级锁,synchronized重量级锁

  • volatile 和synchronized都保证了可见性和有序性

十三、小结

  • volatile 保证了可见性:当一个线程修改了共享变量的值时,其他线程能够立即得知这个修改。

  • volatile 保证了单线程下指令不重排:通过插入内存屏障保证指令执行顺序。

  • volatitle不保证原子性,如a++这种自增操作是有并发风险的,比如扣减库存、发放优惠券的场景。

  • volatile 类型的64位的long型和double型变量,对该变量的读/写具有原子性。

  • volatile 可以用在双重检锁的单例模式种,比synchronized性能更好。

  • volatile 可以用在检查某个状态标记以判断是否退出循环。

 

期待后篇么?CAS走起!

我是悟空,越挫越勇的悟空,奥利给!

悟空

 

参考资料:

《深入理解Java虚拟机》

《Java并发编程的艺术》

《Java并发编程实战》

公众号

 

公众号

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. python3 open保存文本报出 UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters错误

    python3 open保存文本报出 UnicodeEncodeError: ‘ascii’ codec can’t encode characters错误 原因 把文件内容,写入到文件中时,出错了。 而出错的原因其实是,python系统,在使用默认的编码类型,此处的ascii,去将对应的内容,写入到文件中。 但是由于其中一些内容,asci…...

    2024/4/4 18:23:34
  2. leetcode 647. 回文子串

    leetcode 647. 回文子串 题目详情题目链接 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1: 输入:“abc” 输出:3 解释:三个回文子串: “a”, “b”, “c” 示例…...

    2024/4/28 17:27:26
  3. 【洛谷 P1119】灾后重建【Floyed最短路】

    题目背景 题目 BBB地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。 题目描述 给出BBB地区…...

    2024/4/25 10:56:18
  4. UltraISO软碟通制作U盘时显示:请格式化U盘后再试。

    最近先来无事,先要重新安装Deepin,就用UltraISO(软碟通)来制作U盘,没想到一直在让我格式化U盘后再试,我也一直在格式化,但是都没用。然后在想是不是U盘出问题了,就把其他文件拖到U盘里去,没有问题,也可以新建文件等等,用着完全没有问题,就是不能制作启动U盘,就准备…...

    2024/5/2 11:57:40
  5. 如何向公众号添加的百度知道回答的链接

    如何向公众号添加的百度知道回答的链接呢?用普通的方法直接加入外链会被限制,但是我们可以借用工具实现添加外链的功能,如下:进入微信公众号后台,编辑素材的界面,找到并点击点击“小程序”。2、搜索小程序:“网页”,并点击“下一步”。3、小程序的路径改为:“web?u= …...

    2024/4/3 20:12:16
  6. AAAI投稿

    最后,把你的PDF源文件放在一个单独的地方档案馆uldbecompressedusing.zip.thefinal文件大小不能超过10 MB。将源文件命名为第一作者的姓,即使不是你。如果你改变了页面布局,您将需要支付页面费用。其他有问题的命令可能会导致您的论文要拒绝的包括\parindent和\parskip。命令…...

    2024/4/28 10:10:44
  7. Transformer结合CRF,一种电子病历后结构化处理的技术探索

    转发一篇我们技术总监在HIT专家网上的文章。 原文链接:Transformer结合CRF,一种电子病历后结构化处理的技术探索在信 息时代,各行业的数据量都在爆炸式增长,临床医疗数据也呈现出体量大、增速快、形式多样、潜在价值高的特点。在医疗卫生信息化的发展过程中,数据利用问题一…...

    2024/4/3 22:49:19
  8. Java 敏感词替换-dfa算法,效率高

    实现的步骤:1.用一个方法来读取敏感词放入一个List集合2.写一个敏感词库方法读取集合中的敏感词,然后生成树形结构,3.写一个查询传入字符串查询其中的敏感词的方法,找到字符串中的敏感词4.替换敏感词写一个工具类,包含读取敏感词,生成敏感词库,检查字符串中的敏感词几个…...

    2024/4/3 20:23:50
  9. 疫情阻击战,AI显身手,大数据有大用途

    AI(人工智能)测温系统上线、医疗服务机器人交付武汉火神山医院……疫情期间,AI、大数据、云计算等技术在病毒研究、疫情防控、信息传播等方面发挥重要作用。今天璧虎大数据就带领大家一起了解一下AI在本次“疫情狙击战”中都做出了哪些贡献。云计算助力战“疫” 近日,工信部…...

    2024/4/23 15:04:42
  10. 2020怎么降低创业风险?怎么控制APP风险?

    对大多数企业和创业者而言,2020年是充满挑战和机遇的关键一年。 挑战来自于世界经济格局的改变、疫情对经济的冲击,在激烈的竞争下,还有自于产业、服务升级的挑战。 危机的背后是机遇,每一次产业重组,都是一次黄金的创业机遇,例如在2020年春季的在线教育、社区电商迎来的…...

    2024/4/3 19:08:11
  11. 【转载】OpenCV性能衡量与优化方法(十二)

    本次教程我们谈及OpenCV的性能衡量与优化,众所周知,算法的不断的革新其最重要的一点就是不断的优化再优化,比如我们的后面要讲到的边缘检测的算法,又或者是图像分割的算法,他们都是随着时间的一步一步的推移,从而完成算法层面的优化。在以后的学习中,我们会接触到诸多的…...

    2024/4/3 19:12:01
  12. rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout

    rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout# 这个错误的意思是说producer 与broker 通信的时候超时了,按照网上百度的结果: 1.先ping 一下brokerd 的 10911 端口,如果不通,说明需要开通10909-10990的端口; 2可能是网络不…...

    2024/5/2 7:59:10
  13. JavaWeb三大组件   Servlet,Filter,Listener

    JavaWeb三大组件: Servlet,Filter,Listener 1 Servlet 在Java web b/s架构中,servlet扮演了重要的角色,作为一个中转处理的容器,他连接了客户端和服务器端的信息交互和处理。简单来说,客户端发送请求,传递到servlet容器,而servlet将数据转换成服务器端可以处理的数据…...

    2024/5/2 8:28:16
  14. oracle如何设置最大连接数

    查看session:select * from v$session where username is not nullselect username,count(username) from v$session where username is not null group by username当前连接数:select count(*) from v$process查看连接数参数的设置情况select value from v$parameter where …...

    2024/5/1 3:24:00
  15. MySQL数据库库初体验

    文章目录一、MySQL数据库初体验1、数据(Data)2、表3、数据库4、数据库管理系统(DBMS)5、数据库系统6、数据库系统发展史7、当今主流数据库介绍8、关系数据库9、关系数据库4-210、关系型数据库11、非关系数据库介绍12、MySQL数据库介绍13、MySQL商业版与社区版14、MySQL产品阵营…...

    2024/4/3 18:56:59
  16. VS2017 编译Windows下可用的librtmp 库

    librtmp 是开源项目rtmpdump的一个子模块,官网:http://rtmpdump.mplayerhq.hu/,librtmp库封装了rtmp协议,可以用于rtmp推流/拉流,编译rtmpdump 需要用到openssl,zlib第三方库,下面分步骤介绍。1、获取源码可以直接从官网页面的git库获取,也可以在http://rtmpdump.mplay…...

    2024/4/4 0:31:21
  17. Java 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

    import java.util.Scanner; public class zy47 { public static void main(String[] args) { // 思路:创建2个数组,将输入的数与数组1中的元素比较后,按规律将输入的数和数组1中的元素赋值给数组2 int []arr1 = new int[]{1,3,5,7,9,11}; int []arr2 = new int[arr1.length+…...

    2024/4/3 23:23:15
  18. 日常软件推荐

    visual studio Visual Studio 2019 Enterprise BF8Y8-GN2QH-T84XB-QVY3B-RC4DFVisual Studio 2019 Professional NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Ymakrdownme 邮箱: Soar360@live.com MY: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVpbP2M5SN6bnxn2kSE8q…...

    2024/4/4 0:01:52
  19. Linux下的fork()与vfork()函数

    一、fork()函数 fork函数是在<unistd.h>头文件中被定义,是系统的一个服务,fork函数是在当前进程中创建一个新的进程,这个新的进程叫做子进程(child process)。当前进程称作父进程(parent process)。系统负责创建父进程的副本,包括代码段,数据段,堆和栈的复制。 for…...

    2024/4/3 19:57:48
  20. antd中日期选择框ranges属性一些常用的自定义时间选择范围

    ranges={{今日: [moment(), moment()],前三天: [moment().subtract(3, day), moment()],后三天: [moment(), moment().add(3, day)],本周前: [moment().startOf(week), moment()],本周后: [moment(), moment().endOf(week)],本周内: [moment().startOf(week), moment().endOf(w…...

    2024/4/22 2:46:36

最新文章

  1. H2数据库常见问题

    H2数据库问题1 [90048][90048] Unsupported database file version or invalid file header in file “C:/Users/admin/Desktop/temp/2024.05.01/springboot-h2-mybatisplus/db/firstDb.mv.db” [90048-220] The write format 2 is smaller than the supported format 3 [2.2.…...

    2024/5/2 14:10:21
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Go语言中如何实现继承

    完整课程请点击以下链接 Go 语言项目开发实战_Go_实战_项目开发_孔令飞_Commit 规范_最佳实践_企业应用代码-极客时间 Go语言中没有传统意义上的类和继承的概念&#xff0c;但可以通过嵌入类型&#xff08;embedded types&#xff09;来实现类似的功能。嵌入类型允许一个结构…...

    2024/4/30 4:14:53
  4. 腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践

    腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践 文章目录 腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践引言《2023腾讯云容器和函数计算技术实践精选集》整体评价特色亮点分析Serverless与Kubernetes的…...

    2024/5/2 2:36:49
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/2 11:19:01
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/1 13:20:04
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/1 21:18:12
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/2 9:47:31
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/2 9:47:31
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/2 6:03:07
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/2 9:47:30
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/1 11:24:00
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/2 5:31:39
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/1 20:22:59
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/2 9:47:28
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/2 9:47:27
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/2 0:07:22
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/2 8:37:00
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/2 9:47:26
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/2 9:47:25
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/1 14:33:22
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/1 11:51:23
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/2 7:30:11
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/1 20:56:20
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57