原子操作类AtomicInteger
为什么需要AtomicInteger原子操作类?
对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。
要是换成volatile修饰count变量呢?
顺带说下volatile关键字很重要的两个特性:1、保证变量在线程间可见,对volatile变量所有的写操作都能立即反应到其他线程中,换句话说,volatile变量在各个线程中是一致的(得益于java内存模型—“先行发生原则”);2、禁止指令的重排序优化;那么换成volatile修饰count变量后,会有什么效果呢? 试一试:
12345678910111213141516171819202122public class AtomicIntegerTest { private static final int THREADS_CONUT = 20; public static volatile int count = 0; public static v ...
创建线程的七种方法
文章目录
1、什么是多线程
2、线程状态
3、线程同步方法
4、创建线程的七种方法==(重要)==
4.1、继承Thread类
4.2、实现Runnable
4.3、实现Callable接口
4.4、创建线程池
4.5、定时器
4.6、Lambda表达式实现
4.7、Spring实现多线程
4.7.1、Maven工程导入Spring相关依赖
4.7.2、新建Java类,开启@EnableAsync注解
4.7.3、方法类
4.7.4、主方法类
1、什么是多线程
线程被称为轻量级进程,一个进程会有多个线程。但一个线程是程序执行过程中最小单位,每个程序至少一条线程
2、线程状态
1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获 ...
分布式基础理论
CAP和BASE理论:
CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性) 这三个单词首字母组合。
分布式系统中,多个节点之前的网络本来是连通的,但是因为某些故障(比如部分节点网络出了问题)某些节点之间不连通了,整个网络就分成了几块区域,这就叫网络分区。
网络分区容错性是分布式最基本的要求,如果不满足这个就是单体服务了
BASE 是 Basically Available(基本可用) 、Soft-state(软状态) 和 Eventually Consistent(最终一致性)
**基本可用:**基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性。但是,这绝不等价于系统不可用。
软状态:允许系统中的数据存在中间状态(CAP 理论中的数据不一致),并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
最终一致性:是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最 ...
Stream流 collect()方法
Stream流 collect() 方法的使用介绍
123456//1.<R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner);//2.<R, A> R collect(Collector<? super T, A, R> collector);
Stream 流的注意事项:Stream不调用终止方法,中间的操作不会执行。
但是,当我们对 Stream 流中的数据操作完成之后,如果需要将流的结果进行保存,方便我们接下来对结果的继续操作,该怎么办呢?
Stream 流提供了一个 **collect() 方法,**可以收集流中的数据到【集合】或者【数组】中去。
1.收集 Stream 流中的数据到集合中
1234567//1.收集数据到list集合中stream.collect(Collectors.toList())//2 ...
spring常见注解
@Bean注解详解:
1.常见问题思考:
问题1:为啥下面我们明明使用了@Bean 注解但是在spring容器中却找不到该catDemo啊?
123456public class config { @Bean public Cat catDemo(){ return new Cat("小猫!"); }}
原因:单独一个@Bean修饰的 只是一个bean的定义,并没有注册到spring容器中!spring中要使用@Bean修饰 的bean需要将该bean注册到spring容器中!可以使用@Componet 注解 或者该注解修饰的注解将该类注册到容器中的同时连带注册@Bean 修饰的bean .
解决方法:
12345678910111.在类上加入@Componet注解或者是@Componet注解修饰的注解,把该类注入到spring容器,然后由spring容器扫描处理@Bean注解修饰的方法!//@Configuration// @Componentpublic class c ...
SpringBoot集成连接池:
什么是数据库连接池?
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池基本原理?
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
最小连接数
是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
最大连接数
是连接池能申请的最大连接数,如果数据 ...
SpringBoot分片上传、断点续传、大文件
文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比较好的上传体验呢,答案有的,就是下边要介绍的几种上传方式
1.分片上传
1.1 什么是分片上传
分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。
1.2 分片上传的场景
大文件上传
网络环境环境不好,存在需要重传风险的场景
2.断点续传
2.1 什么是断点续传
断点续传是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传或者下载未完成的部分,而没有必要从头开始上传或者下载。
本文的断点续传主要是针对断点上传场景。
2.2 应用场景
断点续传可以看成是分片上传的一个衍生,因 ...
Springboot学习笔记
1.创建第一个项目:
1.引入依赖:
123456<!-- 所有springboot项目都必须继承自 spring-boot-starter-parent ,如果报 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.5</version> </parent>
这里可能会报错:解决Maven ‘parent.relativePath‘ of POM_BingTaiLi的博客-CSDN博客
2. 导入场景
场景启动器
12345678 <dependencies><!-- web开发的场景启动器 --> <dependency> <g ...
Spring 状态机
1、什么是状态机
1.1 什么是状态
先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个自动门,就有 open 和 closed 两种状态。通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如自动门的状态就是两个 open 和 closed 。
状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换图。例如,根据自动门的运行规则,可以抽象出下面这么一个图。
自动门有两个状态,open 和 closed ,closed 状态下,如果读取开门信号,那么状态就会切换为 open 。open 状态下如果读取关门信号,状态就会切换为 closed 。
状态机的全称是有限状态自动机,自动两个字也是包含重要含义的。给定一个状态机,同时给定它的当前状态以及输入,那么输出状态时可以明确的运算出来的。例如对于自动门,给定初始状态 closed ,给定输入“开门”,那么下一个状态时可以运算出来的。
这样状态机的基本定义就介绍完毕了。重复一下:状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的 ...
Spring Boot 多环境配置都
目录
前言
Spring Boot 自带的多环境配置
创建不同环境的配置文件
指定运行的环境
Maven 的多环境配置
创建多环境配置文件
定义激活的变量
pom 文件中定义 profiles
资源过滤
总结
总结
前言
日常开发中至少有三个环境,分别是开发环境(**dev**),测试环境(**test**),生产环境(**prod**)。不同的环境的各种配置都不相同,比如数据库,端口,**IP**地址等信息。那么这么多环境如何区分,如何打包呢?本篇文章就来介绍一下**Spring Boot** 中多环境如何配置,如何打包。
Spring Boot 自带的多环境配置
Spring Boot 对多环境整合已经有了很好的支持,能够在打包,运行间自由切换环境。那么如何配置呢?下面将会逐步介绍。
创建不同环境的配置文件
既然每个环境的配置都不相同,索性将不同环境的配置放在不同的配置文件中,因此需要创建三个不同的配置文件,分别是**application-dev.properties**、**application-test.properties**、**applic ...