stream流的parallelStream的使用
什么是parallelSream
多线程处理问题,除了使用使用线程池(ExecutorService),很多人选择了parallelStream() 并行流,底层使用forkjoin实现并行处理。但是在使用并行流时需要注意一些坑,防止出现问题。
坑
线程不安全
使用parallelSream()时,如果涉及集合操作,需要注意使用线程安全的集合,例如hashMap,arraylist等。
使用公共线程池
parallelStream()底层用的ForkJoinPool.commonPool();进行并行计算。代码中多个脚本同时用到parallelStream时,会共用线程池,一个脚本io慢,其他脚本都等等,用到的脚本越多,卡的时间越长。
并行代码中Threadlocal失效
java开发中,我们经常会用到Threadlocal。parallelStream()是一个隐式线程池,比如:读写分离的连接名称、request通用获取等等,并行代码块中都将失效。
Spring的AOP+自定义注解
AOP
AOP定义
AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。
AOP的使用场景
日志记录
事务管理
权限检验
性能监测
AOP核心概念
核心概念
名称
说明
Joinpoint
连接点,指可以被动态代理拦截目标类的方法
Pointcut
切入点,对Joinpoint进行拦截
Advice
通知,拦截到Joinpoint之后要做的事,切入增强内容|
Target
目标,代理的目标对象
Weaving
植入,将增强代码应用到目标上,生成代理对象的过程
Proxy
代理,生成的代理对象
Aspect
切面,切入点和通知的结合
通知分类
通知
说明|
before
前置通知,通知方法在目标方法调用之前执行
after
后置通知,通知方法在目标方法返回或异常后调用
after-returning
返回后通知,通知方法会在目标方法返回后调用
after-throwing
抛出异常通知,通知方法回在目标方 ...
CountDownLatch
作用
CountDownLatch典型的用法是将一个程序分为n个互相独立的可解决任务,并创建值为n的CountDownLatch。当每一个任务完成时,都会在这个锁存器上调用countDown,等待问题被解决的任务调用这个锁存器的await,将他们自己拦住,直至锁存器计数结束。
使用
CountDownLatch latch=new CountDownLatch(10);
for(int i=0;i<10;i++){
executor.submit({
try{
System.out.println("use CountDownLatch");
}finally{
latch.countDown();
}
});
}
try{
//设置超时时间,防止卡死
latch.await(10,TimeUnit.SECONDS);
}catch(Exception e){
throw e;
}
分页查询
分页查询
select * from data limit 0,10;
直接进行分页查询,从 第 0 条开始,查 10条数据,会出现一个问题,可能查询出的数据不是 id 1-10。因为在优化器选择索引时,如果表内有其他索引,查询就可能会走已经创建的索引,而不是主键索引,导致查出的前十条数据不是 根据 id 排序的前十条。
解决方法就是去除表中的索引
查第 1000 万页
select * from data limit 10000000,10;
数据量越大,查询速度越慢。
覆盖索引 +子查询
#覆盖索引
select id from data limit 10000000,10;
#子查询
select d.* from data d join
(select id from data limit 10000000,10)
t on d.id=t.id;
标签记录
select * from data
where id >10000000
order by id
limit 10;
10000000 是上次查询的最后一条 id
缺点:
只能连续页查询
需要自增的字段
mysql explan的使用
1.作用
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
2.使用方式
explain+sql语句
结果字段如下:
id
select_type
table
type
possible_keys
key_len
ref
rows
extra
2.1 字段含义
id: 表示执行select子句或操作表的顺序
id的三种情况:
id相同—由上至下顺序执行
id不同—序号越高优先级越大
以上两种情况同时存在—相同的部分由上至下依次执行,不同的部分优先级越大越先执行
select_type:表示查询的类型,主要区别在于普通查询、联合查询、子查询等
有六种结果
SIMPLE 简单的select查询,查询中不包含子查询或者UNION
PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY
SUBQUERY 在SELECT或WHERE列表中包含了子查询
DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把 ...
mysql索引详解
分类
按数据结构分类:b+ tree索引、Hash索引、Full-text索引
按物理存储分类:聚簇索引(主键索引)、二级索引(辅助索引)
按字段特性分类:主键索引、唯一索引、普通索引、前缀索引
按字段个数分类:单列索引、联合索引
按数据结构分类
索引类型
InnDB引擎
MyISAM引擎
Memory引擎
B+Tree 索引
Yes
Yes
Yes
HASH索引
NO
NO
Yes
Full-Text
Yes
Yes
NO
InnoDB是Mysql默认存储引擎,B+Tree也是使用最多的引擎
索引列选择:
如果有主键,默认会使用主键作为聚簇索引的索引键(key);
如果没有主键,就选择第一个不包含 NULL 值的唯一列作为聚簇索引的索引键(key);
在上面两个都没有的情况下,InnoDB 将自动生成一个隐式自增 id 列作为聚簇索引的索引键(key);
B+ Tree
B+Tree 是一种多叉树,叶子节点存放数据,非叶子节点存放索引,叶子节点间用双向链表链接。
查询过程
select*from product where id=5; ...
基于Spring自动注入实现的策略模式
实现策略
public interface ActionStrategy(){
void do();
}
@Service
public class DineAction implements ActionStrategy{
@Override
public void do(){
System.out.println("吃饭");
}
}
@Service
public class SleepAction implements ActionStrategy{
@Override
public void do(){
System.out.println("睡觉");
}
}
@Service
public class PlayGameAction implements ActionStrategy{
@Override
public void do(){
System.out.println("打游戏");
}
...
http三次握手
名词
序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。
确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。
控制位:
ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。
RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。
tcp工作在哪一层?
ip协议在网络层,tcp在传输层
什么是tcp?
TCP 是面向连接的、可靠的、基于字节流的传输层通信协议
tcp三次握手🤝
开始
客户端状态:CLOSE
服务端状态:CLOSE
服务端会监 ...
使用线程池
为什么推荐使用ThreadPoolExecutor创建线程池
《阿里巴巴 Java 开发手册》“并发处理”这一章节,明确指出线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。
另外《阿里巴巴 Java 开发手册》中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 构造函数的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险
Executors 返回线程池对象的弊端如下:
FixedThreadPool 和 SingleThreadExecutor : 允许请求的队列长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致 OOM。
CachedThreadPool 和 ScheduledThreadPool : 允许创建的线程数量为 Integer.MAX_VALUE ,可能会创建大量线程,从而导致 OOM。
创建线程池
TreadPoolTaskExecutor.java
@Bean("executor")
public ThreadPoolTaskExecutor au ...
windows美化
本文一些软件会修改系统文件,可能产生bug,谨慎使用
参考
Nord Theme For Windows 11 || Make Your Windows Look || by-Vin star - YouTube
资源
UltraUXThemePatcher | Homepage M. Hoefs - UltraUXThemePatcher (mhoefs.eu)
7TSP GUI 2019 | 7TSP GUI 2019 Edition by devillnside on DeviantArt
windows theme | Windows 11 Themes - Vin Star (vinstartheme.com)
nord theme for windows11 | Nord Theme For Windows - Vin Star (vinstartheme.com)
nord主题壁纸 | wallpaper nord wallpaper
dock栏
仿苹果dock栏
使用mydockfinder,steam平台18元。不过这个软件bug奇多,win11自己的 ...