当前位置: 首页 > news >正文

【JUC】二十、volatile变量的特点与使用场景

文章目录

  • 1、volatile可见性案例
  • 2、线程工作内存与主内存之间的原子操作
  • 3、volatile变量不具有原子性案例
  • 4、无原子性的原因分析:i++
  • 5、volatile变量小总结
  • 6、重排序
  • 7、volatile变量禁重排的案例
  • 8、日常使用场景
  • 9、总结

volatile变量的特点:

  • 可见性
  • 禁重排
  • 无原子性

1、volatile可见性案例

volatile的可见性,即保证不同线程对某一个变量一旦完成更改,其他线程立即可见,因为会从线程的工作内存立马刷到主内存。Demo程序:

public class VolatileDemo1 {static  boolean flag = true;public static void main(String[] args) throws InterruptedException {new Thread(() -> {System.out.println(Thread.currentThread().getName() + "come in ...");while (flag) {}System.out.println("flag被设置为false,线程任务执行结束");}, "t1").start();TimeUnit.SECONDS.sleep(2);flag = false;System.out.println(Thread.currentThread().getName() + "线程已将flag改为false");}
}

flag已被main线程改为false,但t1线程没有收到通知而一直在循环:

在这里插入图片描述

变量改为volatile变量:

static volatile boolean flag = true;

重新运行:

在这里插入图片描述

t1程序可正常停止了,原因就是加了volatile后,flag变量有了可见性,main线程改完后t1可以知道这个变更。

线程t1中为何看不到被主线程main修改为false的flag的值?

可能原因有:

  • 主线程修改了flag之后没有将其刷新到主内存,所以t1线程看不到
  • 主线程将flag刷新到了主内存,但是t1一直自娱自乐,读取的是自己工作内存中fag的值,没有去主内存中更新获取flag最新的值

想解决这个问题需要:

  • 线程中修改了自己工作内存中的副本之后,立即将其刷新到主内存
  • 工作内存中每次读取共享变量时,都去主内存中重新读取,然后拷贝到工作内存。

使用volatile修饰共享变量,就可以达到上面的效果,被volatile修改的变量有以下特点:

  • 线程中读取的时候,每次读取都会去主内存中读取共享变量最新的值,然后将其复制到工作内存
  • 线程中修改了工作内存中变量的副本,修改之后会立即刷新到主内存

2、线程工作内存与主内存之间的原子操作

在这里插入图片描述

  • read:作用于主内存,将变量的值从主内存传输到工作内存,主内存到工作内存

  • load:作用于工作内存,将read从主内存传输的变量值放入工作内存变量副本中,即数据加载

  • use:作用于工作内存,将工作内存变量副本的值传递给执行引擎,每当JVM遇到需要该变量的字节码指令时就会执行该操作

  • assign:作用于工作内存,将从执行引擎接收到的值赋值给工作内存变量,每当JVM遇到一个给变量赋值字节码指令时就会执行该操作

  • store:作用于工作内存,将赋值完毕的工作变量的值写回给主内存

  • write:作用于主内存,将store传输过来的变量值赋值给主内存中的变量

  • lock:作用于主内存,将一个变量标记为一个线程独占的状态,只是写时候加锁,就只是锁了写变量的过程

  • unlock:作用于主内存,把一个处于锁定状态的变量释放,然后才能被其他线程占用
    在这里插入图片描述

以上面的flag变量为例,说明volatile变量的读写过程:

  • step1:先从主内存中读到,然后load加载到线程t1自己的工作内存(read、load成对出现),开始use到while循环,然后一直循环
  • step2:main线程同样的操作从主内存load到自己的工作内存,但它配合CPU完成了对flag的赋值(assign),并存储(store)到自己的工作内存
  • step3:接下来main线程准备要把这个变更写回主内存了,此时必须加锁lock,写完后解锁unlock
  • step4:上一步的加锁后会清空其他线程工作内存这个变量的值,在使用变量前必须重新load或者assign,因此t1线程可以获取到最新的变量值

3、volatile变量不具有原子性案例

volatile变量的复合操作不具有原子性,比如number++

先看不用volatile的:

class MyNumber{int number;public synchronized void addPlus(){number++;}
}

同时开十个线程,每个线程调用1000次addPlus方法:

public class VolatileDemo1 {public static void main(String[] args) throws InterruptedException {MyNumber myNumber = new MyNumber();for (int i = 0; i < 10; i++) {new Thread(() -> {for (int j = 0; j < 1000; j++) {myNumber.addPlus();}},String.valueOf(i)).start();}//给上面线程的计算时间Thread.sleep(2000);System.out.println(myNumber.number);}
}

正常输出10000,修改:不用synchronized,变量改为带volatile关键字的:

在这里插入图片描述

运行,接近10000,但不会等于10000:

在这里插入图片描述

4、无原子性的原因分析:i++

在没有加锁的控制时,就没有原子性的保证(synchronized依靠monitor来保证同一时间只能有一个线程来操作):当线程1对主内存对象发起read操作到write操作第一套流程的时间里,线程2随时都有可能对这个主内存对象发起第二套换作,如下图,虚线表示线程2的读取的可能时机:

在这里插入图片描述

从源代码来看,number++只有一行,但对应到底层则是:

在这里插入图片描述

而线程自己的工作内存里,数据加载、计算和赋值这三步,不是原子操作,是可能被分开的。

在这里插入图片描述

对于volatile变量的可见性,JVM只是保证从主内存加载到线程的工作内存的值是最新的,即数据加载这一步是最新的,对比上面的案例:主内存中,volatile修饰的变量number=5,此时线程A和线程B都能读,线程A要进行+1,线程B也要进行+1,但线程B在CPU的调度下一口气走完了数据加载、计算和赋值这三步,并刷回主内存,此时主内存number=6,而线程B比较慢,刚做完+1的计算,但由于volatile的可见性,主内存中已经等于6了,线程B的值作废,去主内存重读,number = 6,然后线程B一路number+1=7并刷到主内存,一看,两个线程,做了三次+1的操作,结果number只是从5变到7,这就是上面结果接近10000但小于10000的原因

在这里插入图片描述

由此可见volatile解决的是变量读时的可见性问题,但无法保证原子性,对于多线程修改主内存共享变量的场景必须使用加锁同步,加锁,同一时间,最多只能有一个线程进来,每次+1,都能走完写的整体流程,因为其他线程进不来,没有上面那种刚完成数据加载,然后数据就被别的线程改了并刷到主内存,导致自己刚加载的作废的情况。再从i++的字节码来看:

在这里插入图片描述

原子性指的是一个操作是不可中断的,即使是在多线程环境下,一个操作一旦开始就不会被其他线程影响。

很明显,i++是个复合操作,分了三步,不具备原子性。如果第二个线程在第一个线程读取旧值和新值写回期间读取了i的值,就会出现两个线程同时对一个值做加1的情况。比如i=6时,线程1完成了6+1,在写回新值前,线程2读取了数据,继续6+1,不管是线程1和线程2谁先写回主内存,(哪怕都写回主内存也是个7,何况volatile下,慢的那一个线程会去主内存重读),都是6+1做了两次,但最后等于7,相当于加了1次

5、volatile变量小总结

volatile变量不适合参与到依赖当前值的运算,比如i = i+1 ; i++之类的

依靠volatile变量的可见性,其适合用于保存某个状态的Boolean值

6、重排序

在这里插入图片描述

重排序是编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段,但前提是不能改变原语义,或者说指令不能存在数据依赖关系,数据依赖关系即:若两个操作访问同一变量,且这两个操作中有一个为写操作,此时两操作间就存在数据依赖证。

在这里插入图片描述

若存在数据依赖关系,禁止重排序===> 重排序发生,会导致程序运行结果不同。

在这里插入图片描述

7、volatile变量禁重排的案例

在这里插入图片描述

Demo:

public class VolatileDemo2 {int i = 0;volatile boolean flag = false;public void write(){i = 2;flag = true;}public void read(){if(flag){System.out.println("---i = " + i);}}}

在每个volatile写操作后面插入写读屏障:
在这里插入图片描述
在每个volatile读操作后面插入读写屏障,

在这里插入图片描述

如此,程序原来的的语义就得到的保证

8、日常使用场景

Case1:单一赋值可以,但是含有复合运算赋值(如i++)不适用

volatile int a = 10;

Case2:在高并发里面,如果是靠变量来通知其他线程来改变后续动作的,那可利用volatile变量的可见性,做状态标志位,判断业务是否结束

volatile boolean flag = false;

做为一个布尔状态标志,判断业务是否该结束了

在这里插入图片描述

Case3:开销较低的读写锁策略

get和increment方法都加synchronized,安全性是保证了,但太重,性能下降太多:

public class Counter{private  int vlaue;public synchronized int getValue(){  //读也得先拿对象锁return value;}public synchronized int incerment(){return value++;}
}

考虑synchronized结合volatile,此时,也可以每次都读到最新的数据,即使没加锁:

public class Counter{private volatile int vlaue;   //volatilepublic int getValue(){  //利用volatile可见性保证并发下也能读取到最新值return value;}public synchronized int incerment(){  //利用synchronized保证复合操作的原子性return value++;}
}

Case4:DCL双端检查锁的禁重排

参考经典文章:这篇循序渐进,都讲明白了:

  • 【单例模式下的DCL】

大概贴下代码:双端检查锁的普通代码:

在这里插入图片描述

问题:

在这里插入图片描述

重排序后,先给变量指向了分配的内存地址,在初始化对象前,多线程下,其他线程获取,判断对象是否为null,很明显,对象内存地址不为null了,但其实对象还没new,后面用它就会空指针:

在这里插入图片描述

在这里插入图片描述

需要给这个变量加volatile关键字来禁止指令重排:

在这里插入图片描述

Case5:对象属性修改原子类中,更新的对象属性必须使用 public volatile 修饰符

9、总结

凭什么java写了一个volatile关键字,就可以让系统底层加入内存屏障?两者关系怎么勾搭上的?

在这里插入图片描述

什么是内存屏障?

内存屏障是一种 屏障指令,它使得 CPU或编译器对屏障指令的前和后所发出的内存操作执行一个排序的约束 。 也叫内存栅栏或栅栏指令。

内存屏障能干嘛?
  • 阻止屏障两边的指令重排序
  • 写数据时加入屏障,强制将线程私有工作内存的数据刷回主物理内存
  • 读数据时加入屏障,线程私有工作内存的数据失效,重新到主物理内存中获取最新数据

在这里插入图片描述
在这里插入图片描述

内存屏障的四大指令?
  • 在每一个volatile写操作前面插入一个StoreStore屏障
  • 在每一个volatile写操作后面插入一个StoreLoad屏障
  • 在每一个volatile读操作后面插入一个LoadLoad屏障
  • 在每一个volatile读操作后面插入一个LoadStore屏障

总之:volatile即可见性、禁重排、以及无原子性

  • volatile 写之前的操作,都禁止重排序到 volatile 之后
  • volatile 读之后的操作,都禁止重排序到 volatile 之前
  • volatile 写之后 volatile 读,禁止重排序

相关文章:

【JUC】二十、volatile变量的特点与使用场景

文章目录 1、volatile可见性案例2、线程工作内存与主内存之间的原子操作3、volatile变量不具有原子性案例4、无原子性的原因分析&#xff1a;i5、volatile变量小总结6、重排序7、volatile变量禁重排的案例8、日常使用场景9、总结 volatile变量的特点&#xff1a; 可见性禁重排无…...

软件工程期末复习(2)

学习资料 设计模式与软件体系结构【期末全整理答案】_软件设计模式与体系结构期末考试题_鸽子不二的博客-CSDN博客 软件设计与体系结构(第二版)部分习题_软件设计与体系结构第二版课后答案-CSDN博客 软件体系结构试题库试题和答案 - 豆丁网Docin 软件设计与体系结构复习 - CN…...

[vue3] 使用 vite 创建vue3项目的详细流程

一、vite介绍 Vite&#xff08;法语意为 “快速的”&#xff0c;发音 /vit/&#xff0c;发音同 “veet”) 是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验&#xff08;热更新、打包构建速度更快&#xff09;。 二、使用vite构建项目 【学习指南】学习新技能最…...

#HarmonyOS:软件安装window和mac预览Hello World

Window软件地址 https://developer.harmonyos.com/cn/develop/deveco-studio#download 安装的建议 这个界面这样选&#xff0c;其他界面全部按照默认路径往下走&#xff01;&#xff01;&#xff01; 等待安装… 安装环境错误处理 一般就是本地node配置异常导致&#xff…...

nginx 一键切换停机维护页面 —— 筑梦之路

背景说明 进行停机维护或者系统升级等操作&#xff0c;会影响到用户使用&#xff0c;如果停机维护期间用户未看到停机维护的通知&#xff0c;仍去访问系统&#xff0c;会提示默认不太友好的访问错误界面 &#xff0c;这时如果在维护的时候直接展示停机公告的具体信息&#xff0…...

Python作业答疑

1. 旋转字符串 1.1 问题描述 给定一个字符串&#xff08;以字符数组的形式&#xff09;和一个偏移量&#xff0c;根据偏移量原地从左向右旋转字符串。 1.2 问题示例 输入str"abcdefg"&#xff0c;offset3&#xff0c;输出"efgabcd"。 输入str"ab…...

计算机网络实用工具之Hydra

简介 Hydra 是一个并行登录破解程序&#xff0c;支持多种协议进行攻击。它非常快速且灵活&#xff0c;并且很容易添加新模块。 该工具使研究人员和安全顾问能够展示远程未经授权访问系统是多么容易。 目前该工具支持以下协议&#xff1a; Asterisk, AFP, Cisco AAA, Cisco au…...

AUTOSAR 入门

前言 AUTOSAR是什么Vector DaVinci 工具功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必…...

新版IDEA中,module模块无法被识别,类全部变成咖啡杯无法被识

新版IDEA中&#xff0c;module模块无法被识别&#xff0c;类全部变成咖啡杯无法被识 如下图&#xff1a; 解决方法&#xff1a;java的Directory文件没有被设置为根目录&#xff0c;解决方法如下&#xff1a; 这是方法之一&#xff0c;还有很多的原因 可能的原因&#xff1a; …...

vue.js el-table 动态单元格列合并

一、业务需求&#xff1a; 一个展示列表&#xff0c;表格中有一部分列是根据后端接口动态展示&#xff0c;对于不同类型的数据展示效果不一样。如果接口返回数据是’类型1‘的&#xff0c;则正常展示&#xff0c;如果是’类型2‘的数据&#xff0c;则合并当前数据的动态表格。…...

word模板导出word文件

前期准备工作word模板 右键字段如果无编辑域 ctrlF9 一下&#xff0c;然后再右键 wps 直接 ctrlF9 会变成编辑域 pom.xml所需依赖 <dependencies> <!--word 依赖--> <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId…...

debianubuntu的nvidia驱动升级

背景 给出的机器的驱动版本不符合要求&#xff0c;使用自定义的驱动版本。 前置 如果使用nvidia官方的.run安装的驱动包&#xff0c;可以使用系统自带的nvidia-uninstall命令卸载比较方便&#xff0c;不建议使用apt pruge nvidia-*命令删除。会带来其他的问题。 卸载完成之…...

【开源视频联动物联网平台】视频接入网关的用法

视频接入网关是一种功能强大的视频网关设备&#xff0c;能够解决各种视频接入、视频输出、视频转码和视频融合等问题。它可以在应急指挥、智慧融合等项目中发挥重要作用&#xff0c;与各种系统进行对接&#xff0c;解决视频能力跨系统集成的难题。 很多视频接入网关在接入协议…...

【bug排查解决】现象级延迟8-10s

业务背景 最近公司在做物联网相关的项目&#xff0c;调试过程中发现好玩的bug。 首先一个数据采集场景&#xff0c;plc采集数据全链路&#xff1a; kepServer&#xff08;kepserver IOT gateway&#xff09; -> emqx &#xff08;查看日志&#xff09;-> iot服务 -> 业…...

【人生感悟】不能对一个人太好是有心理学原理的

1、不能对一个人太好是有心理学原理的&#xff0c;当你长期友善对待一个人时&#xff0c;如果这个人认知程度不是很高&#xff0c;层次稍微的偏低&#xff0c;那他可能直接把你的友善理解为理所应当&#xff0c;甚至是你在讨好他&#xff0c;还会把你们之间的关系理解成他是高于…...

动态规划学习——最长回文子序列,让字符串变成回文串的最小插入次数

一&#xff0c;最长回文串 1.题目 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&…...

CSS新手入门笔记整理:CSS列表样式

列表项符号&#xff1a;list-style-type 在HTML中&#xff0c;对于有序列表和无序列表的列表项符号&#xff0c;都是使用type属性来定义的。 语法 list-style-type:取值; list-style-type属性是针对ol或者ul元素的&#xff0c;而不是li元素。 有序列表属性 属性值 说明 …...

12月07日,每日信息差

以下是2023年12月07日的11条信息差 第一、社交媒体公司X计划在日本成立应用开发团队 第二、造车进程加快&#xff0c;小米汽车在多地招聘零售门店主管&#xff0c;零售门店主管工作地点涉及武汉、重庆、长沙、郑州、佛山、东莞、厦门等城市 第三、我国西南地区首座百万千瓦级…...

spring mvc理解

spring mvc M&#xff1a;model 模型 V&#xff1a;view 视图 C&#xff1a;controller 控制器 S: service 服务处理 D: Dao 数据持久化 视图 我理解就是web页面&#xff0c;帮助用户调用后端接口。 前后端分离之后&#xff0c;view似乎就和后端没什么关系了。 模型 格式…...

HTML-标签之文字排版、图片、链接、音视频

1、标签语法 HTML超文本标记语言——HyperText Markup Language 超文本是链接标记也叫标签&#xff0c;带尖括号的文本 2、HTML基本骨架 HTML基本骨架是网页模板 html&#xff1a;整个网页head&#xff1a;网页头部&#xff0c;存放给浏览器看的代码&#xff0c;例如CSSbody…...

圣诞将至—C语言圣诞树代码来啦

文章目录 圣诞将至—C实现语言圣诞树源码 圣诞将至—C实现语言圣诞树 圣诞树 源码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <math.h> #include <stdlib.h> #include <windows.h> #include <time.h> #define PI 3.14159265…...

Git常用命令#merge分支合并

要查看所有分支&#xff0c;包括本地和远程仓库的分支&#xff0c;可以使用以下命令&#xff1a; 1.查看分支 1.1 查看本地分支 git branch这个命令会列出本地所有的分支&#xff0c;当前所在的分支会有 * 标记。 1.2 查看远程分支 git branch -r这个命令会列出远程仓库的分…...

Windows server 2019 域环境部署

环境准备 准备3台服务器&#xff0c;配置都是8g2核&#xff0c;50g硬盘&#xff0c;操作系统版本Windows Server 2019 Datacenter 域服务器&#xff1a;adc&#xff0c;192.168.56.120服务器1&#xff1a;server1:&#xff0c;192.168.56.121服务器2&#xff1a;server2&…...

Cocos Creator加入图片没有被识别

原因&#xff0c;需要更换类型&#xff0c;选择下图中的类型...

java double类型保留两位小数并去除后面多余的0

public static void main(String[] args) {double value9.100001;//保留两位小数String format String.format("%.2f", value);//去除多余的0String strValue new BigDecimal(format).stripTrailingZeros().toPlainString();System.out.println("strValue &q…...

C++学习寄录(九.多态)

1.多态基本概念 先来看这样的代码&#xff0c;我的本意是想要输出“小猫在说话”&#xff0c;但实际输出的却是“动物在说话”。这是因为地址早绑定&#xff0c;在代码编译阶段就已经确定了函数地址&#xff1b;如果想要实现既定目标&#xff0c;那么这个dospeak&#xff08;&…...

【Linux基础开发工具】yum生态vim的配置与使用

目录 前言 1. Linux 软件包管理器 yum 1.1 什么是yum 1.2 快速上手yum 1.3 yum生态 2. Linux编辑器vim 2.1 vim的模式 2.2 vim使用技巧 3. vim编辑器辅助功能配置 3.1 配置 3.2 用户sudo权限配置 总结 前言 Linux基础指令与权限之后&#xff0c;Linux系统开发工具的使用…...

java-HashMap、TreeMap、LinkedHashMap、ArrayList、LinkedList使用笔记

背景 Map<String, Integer> unsortedMap new HashMap<>(); unsortedMap.put("One", 1); unsortedMap.put("Two", 2); unsortedMap.put("Three", 3); unsortedMap.put("Four", 4); 一、关于排序 TreeMap&#…...

Oracle中mybatis批量更新报错ORA-00933:SQL命令未正确结束

项目场景&#xff1a; 最近在开发项目的过程中遇见了这个问题&#xff1a;Oracle中批量更新的时候报错 ORA-00933&#xff1a;SQL命令未正确结束 问题描述 mybatis批量更新报错ORA-00933&#xff1a;SQL命令未正确结束 <foreach item"item" index"index&q…...

Mysql综合案例练习<1>

MySql综合案例练习<1> 题目一题目二题目三题目四题目五题目六题目七题目八题目九题目十题目十一题目十二题目十三题目十四题目十五题目十六题目十七题目十八题目十九 题目一 创建数据库test01_library 创建表 books&#xff0c;表结构如下&#xff1a; CREATE DATABASE …...

Linux系统编程:线程总结

线程的概念 基本概念 所谓线程&#xff0c;通俗的说就是一个正在运行的函数。 在Linux系统中&#xff0c;线程是程序运行的最小单位&#xff0c;也被视为进程内部的控制序列。同一进程下的多个线程共享进程的所有资源&#xff0c;包括进程环境变量、打开的文件描述符、信号量…...

activemq启动成功但web管理页面却无法访问

前提&#xff1a; 在linux启动activemq成功&#xff01;本地能ping通linux 处理方案&#xff1a; 确定防火墙是否关闭&#xff0c; 有两种处理方案&#xff1a;第一种-关闭防火墙&#xff1b;第二种-暴漏8161和61616两个端口 netstat -lnpt查看8161和61616端口 注意&#xf…...

【Flink on k8s】- 0 - Flink kubernetes operator 快速入门与实战

完整的课程,请点击链接。 目录 一、你将收获 二、适用人群 三、课程介绍...

毕设:《基于hive的音乐数据分析系统的设计与实现》

文章目录 环境启动一、爬取数据1.1、歌单信息1.2、每首歌前20条评论1.3、排行榜 二、搭建环境1.1、搭建JAVA1.2、配置hadoop1.3、配置Hadoop环境&#xff1a;YARN1.4、MYSQL1.5、HIVE(数据仓库)1.6、Sqoop&#xff08;关系数据库数据迁移&#xff09; 三、hadoop配置内存四、导…...

PHP使用HTTP代码示例模板

PHP是一种广泛用于服务器端的编程语言&#xff0c;它提供了许多内置的函数和扩展&#xff0c;以便开发人员能够轻松地处理HTTP请求和响应。在PHP中&#xff0c;您可以使用以下代码示例模板来处理HTTP请求和生成HTTP响应。 php复制代码 <?php // 处理GET请求 if ($…...

头歌题目-数组

任务描述 题目描述:找出具有m行n列二维数组Array的“鞍点”&#xff0c;即该位置上的元素在该行上最大&#xff0c;在该列上最小&#xff0c;其中1<m,n<10。 相关知识&#xff08;略&#xff09; 编程要求 输入 输入数据有多行&#xff0c;第一行有两个数m和n&#…...

C++ vector基本操作

目录 一、介绍 二、定义 三、迭代器 四、容量操作 1、size 2、capacity 3、empty 4、resize 5、reserve 总结&#xff08;扩容机制&#xff09; 五、增删查改 1、push_back & pop_back 2、find 3、insert 4、erase 5、swap 6、operator[] 一、介绍 vector…...

使用SLS日志服务采集Kong网关的日志

一、阿里云SLS 官方的接入文档已比较丰富了&#xff0c;本文不意重复说明此事。 站在使用的角度&#xff0c;以采集Kong的日志为示例&#xff0c;说明我们应该如何治理日志。 说白了&#xff0c;本文是想给你怎么省钱作一个建议&#xff0c;希望不会让你公司也“降本增笑”。…...

TA-Lib学习研究笔记(九)——Pattern Recognition (1)

TA-Lib学习研究笔记&#xff08;九&#xff09;——Pattern Recognition &#xff08;1&#xff09; 0.程序代码 形态识别的函数的应用&#xff0c;通过使用A股实际的数据&#xff0c;验证形态识别函数&#xff0c;用K线显示出现标志的形态走势&#xff0c;由于入口参数基本上…...

基于GAN的多尺度门合并多模态MRI图像合成

Multi-Modal MRI Image Synthesis via GAN With Multi-Scale Gate Mergence 基于GAN的多尺度门合并多模态MRI图像合成背景贡献实验方法生成器gate mergence (GM) strategy&#xff08;门控融合策略&#xff09;判别器 损失函数Thinking 基于GAN的多尺度门合并多模态MRI图像合成…...

浅谈https

1.网络传输的安全性 http 协议&#xff1a;不安全&#xff0c;未加密https 协议&#xff1a;安全&#xff0c;对请求报文和响应报文做加密 2.对称加密与非对称加密 2.1 对称加密 特点&#xff1a; 加解密使用 相同 秘钥 高效&#xff0c;适用于大量数据的加密场景 算法公开&a…...

计算两个结构的差

平面上有6个点&#xff0c;以6a1的方式运动 1 1 1 1 - - - 1 - - - 1 现在有一个点逃逸&#xff0c;剩下的5个点将如何运动&#xff1f; 2 2 2 3 - - - 3 - - - 3 将6a1的6个点减去1个点&#xff0c;只有两种可能&#xff0c;或者变成5a2&#xff0c…...

class037 二叉树高频题目-下-不含树型dp【算法】

class037 二叉树高频题目-下-不含树型dp【算法】 code1 236. 二叉树的最近公共祖先 // 普通二叉树上寻找两个节点的最近公共祖先 // 测试链接 : https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ package class037;// 普通二叉树上寻找两个节点的最近…...

使用cpolar完成内网穿刺

cpolar官网上有一句评论&#xff1a;cpolar是用过最简单的内网穿刺工具&#xff01; 实际体验下来&#xff0c;cpolar确实是能够非常简单地实现内网穿刺 先说弊端&#xff0c;免费版的cpolar提供的穿刺地址&#xff0c;有效期为一天&#xff0c;进程连接数有限&#xff0c;如…...

git的使用:基础配置和命令行

前言 代码管理工具,任何开发都离不开的话题。 到了任何公司,第一件事肯定是配置个人的电脑。主要就是三点,配置对应的开发环境,配置各类开发工具和配置git等代码管理工具拉取代码。 这篇文章主要是git的配置和最常用(我指的是最常用)的命令行使用 git基础配置 git的安装 …...

若依微服务项目整合rocketMq

原文链接&#xff1a;ttps://mp.weixin.qq.com/s/IYdo_suKvvReqCiEKjCeHw 第一步下载若依项目 第二步安装rocketMq&#xff08;推荐在linux使用docker部署比较快&#xff09; 第二步新建一个生产者模块儿&#xff0c;再建一个消费者模块 第四步在getway模块中配置接口映射规…...

连接服务器的ssh终端自动断开解放方法

在Linux中&#xff0c;SSH连接在一段时间内没有活动时可能会自动断开&#xff0c;这是为了安全性考虑的一种默认行为&#xff0c;以防止未经授权的访问。这个时间限制通常由SSH服务器的配置决定。你可以通过以下几种方式来处理这个问题&#xff1a; 1.使用SSH配置文件&#xf…...

Windows+WSL开发环境下微服务注册(Consul)指定IP

Win11下安装一个WSL2&#xff0c;做开发环境&#xff0c;简直是爽到不要不要的&#xff0c;相当于既有Windows下的完善生态&#xff0c;又有linux的便利。特别是&#xff0c;在linux下运行的服务端口号&#xff0c;完全和windows是相通的&#xff0c;直接在windows下浏览访问&a…...

通过K8S安装人大金仓数据库

1. 离线下载镜像&#xff0c;请点击 2. 官网下载镜像 https://www.kingbase.com.cn/xzzx/index.htm&#xff0c;根据自己的需求下载对应版本。 3. K8S需要的yaml清单 cat > kingbase.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata:name: kingbase-…...

正则表达式(3):入门

正则表达式&#xff08;3&#xff09;&#xff1a;入门 小结 本博文转载自 从这篇文章开始&#xff0c;我们将介绍怎样在Linux中使用”正则表达式”&#xff0c;如果你想要学习怎样在Linux中使用正则表达式&#xff0c;这些文章就是你所需要的。 在认识”正则表达式”之前&am…...