- 博客(46)
- 收藏
- 关注
原创 并发编程学习笔记-day02
1、多线程执行是依靠计算机的任务调度器来进行调度执行的 所以我们只能控制线程的启动而不能控制线程的执行而且计算 机系统会利用时间片来进行线程的上下文切换 2、如果电脑是单核CPU(现实中一般在虚拟机设置单核)多线程 会并发执行,执行时会导致CPU100%被占用会导致其他进程无法执行。1、线程执行时栈会给线程分配一块栈内存空间 2、线程执行方法时会给方法在线程栈内存空间内分配栈帧内存 3、一个线程只有一个活动栈帧 4、执行方法时成员变量存储在栈帧局部变量区中。会保存线程下一条指令执行的地址是。
2024-10-10 22:08:02 330
原创 排序算法分类及其稳定性
基准元素和末位元素交换元素,且首指针+1尾指针不变 若基准元素小于末位元素的话则元素不交换首指针不变尾指针+1直到基准元素将原数组分隔为1个或多个数组然后再在剩余的数组里面采用递归的形式实现快速排序。先通过数组底部两个相邻元素(Xi和X(i-1))的比较和交换接着比较(X(i-2)和X(i-1))依次进行i的自减比较直到得到最小或最大元素 将其移出比较数组移入排序数组即可。先选出排序码最小的元素然后移入排序数组接着在剩下的元素中选出排序码最小的元素依次进行可得到一个有序序列。1、直接选择排序 不稳定。
2024-10-10 07:55:30 492
原创 并发编程学习笔记-day01
的话那么多个线程一起执行和单个线程执行完三个任务的效率是差不多的,因为单核cpu的话线程并发执行是轮询执行的涉及到线程上下文切换所以。//获取线程返回结果,且task.get为等待状态,task.get()的执行完成时间等于线程的执行完成时间。的话那么线程的执行可以并行处理,处理时长取决于任务时间最长的那个线程最后再将累加所需时间加在一起便是任务完成的执行时间,new Thread(runnable,"t1").start//启动线程,t1为线程名称。Runnable是将代码块执行任务与线程分开的。
2024-10-10 00:03:42 328
原创 数据结构—堆
又由于完全二叉树的特性所以我们可以根据根节点的索引来找到其左右孩子节点 左孩子结点为根节点索引2倍 右孩子节点为2倍+1 如果通过孩子节点找父节点则可倒推。指每次取堆顶作为最大值或最小值和堆的最后一个元素做交换依次正序或倒序插入数组中然后消除已经交换的堆顶元素 接着对再次对堆进行建堆处理 再次取堆顶元素即可完成排序。大根堆就是二叉树及其子树的根节点大于等于其左右孩子节点。指的是非叶子节点二叉树子树向下依次调整为堆结构。堆首先它是一个完全二叉树,存储结构为数组。小根堆则是根节点小于等于其左右孩子节点。
2024-09-19 07:46:10 103 1
原创 Spring——Bean的生命周期
实现上述方法之后我们并不能直观的感受到Bean被销毁前的操作因为程序执行完后虚拟机就关闭力,IOC容器还没来得及关闭,所以我们要在虚拟机关闭前对容器进行关闭操作。其中Bean的实例化有四种方法、构造器实例化、静态工厂、实例工厂、实现FactoryBean接口。对于Bean的生命周期我们可以在Bean初始化之后、销毁之前对Bean进行控制。Bean的生命周期牵扯到Bean的实例化、属性赋值、初始化、销毁。1、调用close方法暴力关闭容器(直接关闭容器)1、在Bean的对象中写入初始化以及销毁的方法。
2024-08-18 16:48:50 167
原创 Spring——bean的基础配置以及四个实例化方法
通过测试程序可知Spring创建的Bean是单例bean这是因为bean的范围配置是在Bean标签中的scope属性配置的而singleton是默认设置为单例设置为prototype则bean为多例。如果对象的状态保持不变的话我们使用多例bean会牵扯的对象的不断创建这牵扯的cpu以及内存的消耗是非常没必要的所以我们使用单例bean需要时直接从容器中拿即可。一、Bean的基础配置包含Bean的别名(name)以及作用范围的配置(scope)使用单例bean和多例bean的基本原则。Controller层。
2024-08-18 16:32:55 248
原创 Spring——IOC/DI思想
当业务层需要数据层的对象时,IOC容器会帮我们对对象进行创建和初始化等一系列操作。,此时IOC容器的另一个作用就体现出来了,它会对有关系的对象进行依赖传递,将两个Bean绑定起来,此时。1、IOC(Inversion of Control)控制反转。既然在上面的IOC思想中我们已经把Bean交给容器去管理,数据层对象就会在IOC中创建出来并初始化给到业务层从而使。在业务层中我们如果要调用数据层的方法那么必然牵扯到。的问题,所以提出来IOC的思想,也就是将。的对象通一称为Bean。运行,这样就会存在一个。
2024-08-15 23:05:13 352
原创 算法——长度最小的子数组209 对比代码随想录题解中对于result取值为Integer.MAX_VALUE的思考
情况二:如果我们设置result=0的话,是不是在while处直接将result=j-i+1不就行了,然而提交之后是有用例错误的,后来经过思考我发现是我自己不够严谨,如果我们找到仅有一个符合要求的滑动窗口时那这样做应该是没错的,可问题是如果找到第二个及以上滑动窗口时且滑动窗口符合条件的子数组长度大于前面的滑动窗口时我们的result就变为一个更大的值了这不符合题目要求,所以我们需要通过一个。情况一:如果result为负数的话是不符合数组长度取值的一个规范的。具体解题过程可看代码随想录,我主要是对于。
2024-08-03 20:36:33 250
原创 vue2一个计时器的功能
这样一个功能,我们可以利用sessionStorage来存储我们进入网站的时间戳,每次刷新页面时判断sessionStorage是否有这个时间戳如果有则不对初试时间进行存储如果没有则存储时间戳,然后每次刷新页面时记录下当前时间戳与sessionStorage中的初试时间作一个减法可得到学习的时间,但这是的时间是不规范的是毫秒级别的 所以我们再对其进行一个格式化得到 小时(hour)、分钟(minute)、秒(second)接着修改start中他人的代码 将上述变量添加其中即可。
2024-07-14 14:23:36 405 1
原创 Java基础--AOP--2.通知类型
1、:方法执行前通知2、:方法执行前后通知3、:方法执行后通知,不管有没有抛出异常都会通知4、:方法成功执行后没有抛异常通知5、:方法执行异常时通知。
2024-06-23 21:46:20 288 1
原创 Redis——5、持久化RDB和AOF
上面包含了虚拟地址和物理地址的映射关系,当我们修改虚拟地址的数据时对应的物理地址的数据也会由于映射而改变,可如果只用主进程来执行RDB的话,会阻塞主进程的所有命令,所以我们通常采用bgsave来开启一个子进程执行RDB,AOF简单来说就是将每次的Redis命令记录到AOF文件中,相当于日志记录,当Redis实例宕机时,从磁盘读取AOF文件重新执行一次AOF中命令即可恢复数据,数据完整性较高,刷盘策略决定了AOF文件更新的频率。#指的是当AOF文件大于原来的150%时进行bgrewrite文件重写。
2024-06-19 01:34:56 540
原创 数据库表中创建字段查询出来却为NULL?
今天了一张表,其中一个字段命名为"word_num"带下划线,我在前端页面怎么也查询不出来word_num的值,后来在后端接口处打印了一下数据库查询出来的数据,发现这个字段一直为NULL,然后我就想到是不是的有问题,遂一直修改字段,后来我又添加了一个字段"num"设置随机值前端就可以显示出来,我又重启了下数据库,一直想着我也没开启事务啊不可能出现脏读、幻读等情况吧,一直摸不着头脑,后上了趟厕所脑海中四个大字“!!我就一直在配置类里面找,也没找到。
2024-06-08 16:34:48 360
原创 Spring中的bean是线程安全的吗
一般来说Spring中的bean都是。的,但是如果在bean中定义了一个。在Spring框架中有一个注解。Spring中的bean是。
2024-05-27 21:00:19 151
原创 MySQL——2、并发事务所带来的问题是什么?怎样去解决?MySQL的默认隔离级别是什么
1、脏读:就是一个事务对数据进行查询操作时而另一个事物在,这时进行查询操作的事务就会读取到未提交的数据也就是脏数据2、不可重复读:事务A查询一次数据接着事务B修改了数据并且已提交事务A继续执行操作查询数据。3、幻读:事务执行查询数据时不存在,插入数据时却报错,再次查询时还是在。原因在于事务A查询的时候数据库确实没有对应索引的数据但之后事务B却进行了插入操作,事务A再次查询时还是查不到(这是因为我们已经实现了可重复读)
2024-05-26 18:55:15 1118
原创 MySQL——1、事务的特性
指的是事务在开展过程中是不受并发操作的干扰的,是处于一个独立环境中的。:指的是事务是不可分割的最小最小操作单元,要么全部成功,要么全部失败。:指的是进行事务后,提交或者回归对数据的改变是永久的,是存在磁盘上的。:事务完成时,必须使所有数据保持一致状态。
2024-05-26 18:21:50 217
原创 MySQL——7、什么情况下索引会失效
4、索引字段未添加单引号(会在类型转换时报错)5、模糊查询‘%’放在了索引字段的左边。2、范围查询右边的列不能使用索引。1、不符合最左前缀法则。3、索引列添加了运算符。
2024-05-26 17:53:34 259
原创 MySQL——6、创建索引的原则
4、创建索引的字段如果较长的话我们可以只截取字符串前面的一部分作为。是需要创建索引的(提升用户体验)提升查询效率。一条sql的返回值尽量使用盖索引。1、数据量较大一般是数据量达到。时我们是需要创建索引的。2、在对一些数据进行。
2024-05-26 16:36:18 169
原创 MySQL——5、什么是覆盖索引以及超大分页查询的效率提升
指的是使用索聚簇索引),而不用我们在实际开发中要尽量以此来避免回表查询 ,以此来提升查询效率。
2024-05-26 16:23:19 195
原创 MySQL——3、什么是索引?索引的底层结构是什么?
1)B+树只有叶子节点存储数据,非叶子节点只存储指针2)B+树是一个矮胖树,层级低查找效率高3)叶子节点之间是以双向链表的形式存在的,便于扫库,和区间查询。
2024-05-26 15:34:37 230
原创 MySQL——2、如何分析sql执行很慢的原因
来确认sql是否有进一步的优化空间,是否存在全索引查询或全盘扫描查询。是否命中索引,如果本身已经添加了索引也可以查看索引是否失效。是否有回表的情况,如果有尝试添加索引或者修改返回字段来修复。
2024-05-26 14:59:01 157
原创 MySQL——1、如何定位慢查询
可以在MySQL的配置文件中开启日志功能,设置sql响应时间阈值 ,如果响应时间大于这个阈值的话,对应sql语句就会展现在日志中,我们就可以定位到慢查询的语句了。它可以监测接口的相应时间,展现在报表上,接着我们就可以查看是哪个接口对应的sql执行语句比较慢,定位慢查询。
2024-05-26 13:06:25 247
原创 多线程——6、怎样终止线程
1)打断阻塞的线程(wait()、wait(lang)、sleep(lang))使用Interrupt抛出异常来终止线程。run方法调用后的正常结束,也就是给run添加一个信号量当设置这个信号量为false的时候线程就结束了。2)打断正在运行的线程,其实跟方法一一样,只不过信号量为Interrupt。使用stop方法来强制终止线程(不推荐、已废弃)
2024-05-26 11:44:03 247
原创 多线程——5、线程的执行顺序、wait和sleep方法的不同
wait()、wait(lang)、sleep(long)都是线程放弃CPU的使用权,进入阻塞状态。2)wait()和wait(lang)还可以被notify()唤醒,wait如果不唤醒就一直等待。2)wait()和wait(lang)属于Object类的成员方法,任何对象都可以调用。1)sleep(lang)和wait(lang)需要等待相应毫秒数才可以醒来。1)wait方法需要wait对象的锁才可以执行,sleep()不用。1)sleep(lang)属于thread类的静态方法。
2024-05-25 21:47:40 196
原创 多线程——3、创建线程的方式
2、Callable创建线程有返回值,是个泛型,配合Future和Futruetask来获取异步执行的结果。3、Calable可以抛出异常Runable不能抛出异常只能内部消化。start是一个线程的开启,而一个线程实例只能在同一时刻开启一个。run方法是线程的任务,相当于普通的方法调用并不会开启线程。1、Runable创建线程没有返回值。3、实现Callable接口。2、实现Runable接口。1、继承Thread类。
2024-05-25 19:58:09 174
原创 多线程——2、并行和并发是什么?
由于cpu运行速度很快各个线程上下文切换也很快人几乎感受不到,所以在微观下是串行的、宏观下是并行的。在多核CPU下不同核心同时进行不同线程的任务这就是并行。也就是在同一时间段在宏观上是有多个线程一起执行的。在单核CPU下采用时间片轮转法各个线程交替执行。
2024-05-25 19:31:16 126
原创 多线程——1、进程和线程
线程是轻量的,线程上下文切换成本要比进程低(上下文切换指的是从一个线程切换到另一个线程)进程是正在运行程序的实例,一个进程下包含多个线程,每个线程执行不同的任务。每个进程被分配的内存空间是不同的,在同一进程下的所有线程是共享内存空间的。
2024-05-25 18:58:34 220
原创 JAVA-基础——集合框架
1)HashTable(有锁性能不高、官方不推荐使用) 是线程安全的有一个实现类是properties在一些配置文件中会使用。3)ConcurrentHashMap(实现线程安全的方法不一样、性能高)是线程安全的 是哈希表结构。其中HashSet的层是哈希表接口有一个实现类是LinkedHashSet是哈希表+链表结构。2)HashMap 是非线程安全的 是哈希表结构 有一个实现类是LinkedHashMap。4)TreeMap 是红黑树结构。3)TreeSet底层是红黑树。
2024-05-25 18:33:45 155
原创 Redis——4、如何保证双写一致性
双写一致性:也就是我们在更新数据库数据的同时也要同时更新缓存中相应的数据来保证数据的一致性,避免读到脏数据。在业务场景中我们有的业务例如转账业务是需要保证的,有的业务例如一些论坛图片的加载保证其即可。那么我们怎么去保证数据库与缓存的双写一致性来呢?也就是我们在进行数据的写操作时,先删除缓存中的数据,接着更新数据库中的数据,然后延迟一段时间后再次删除缓存中的数据。那为什么我们不能先删除缓存中的数据然后更新数据库接着将数据进行缓存或者先更新数据库再将缓存中的数据进行删除呢?
2024-05-24 21:13:52 228 1
原创 Redis——3、什么是缓存雪崩
指的是在缓存中的key设置了,在同一时间大量缓存过期或者Redis宕机,导致大量请求直接请求数据库,数据库造成雪崩。
2024-05-23 18:02:30 211 1
原创 Redis——2、什么是缓存击穿
当Redis中热点数据的key正好过期的时候,对这个key进行大量的并发请求,这时所有请求都在缓存中不能命中,那么会导致直接去查询数据库,这样DB难以负载会崩掉。这就是缓存击穿。
2024-05-23 17:44:55 282 1
原创 HashMap——5.HashMap中的put方法
如果我们直接使用key.hashCode()返回哈希值的话,在进行哈希位运算时(key&(capacity-1))时高位如果变动大的话,对哈希索引值hash的的计算结果的影响是较小的,故而产生哈希碰撞的概率就要大一点。0000 0000 0000 0000 0000 0000 0000 1111 length-1(进行位运算)0000 0000 0000 0000 0000 0000 0000 1111 length-1 进行位运算。2、根据哈希值计算出索引值hash找到哈希桶的位置。
2024-05-23 11:12:13 765 1
原创 HashMap——4.HashMap中的构造方法
可能我们传入InitialCapacity为10时threshold经过处理后为16,这显然不符合常理,但threshold并不是不变的,它会在HashMap使用put方法时重新改变。在创建HashMap数组时会按照成员变量默认的值进行传参,如HashMap的初始容量为2^4,加载因子为0.75。创建HashMap时初始容量会根据传入的参数经过一些方法的处理后会得到一系列计算后的HashMap需要扩容时的。,但加载因子一般为0.75时综合利用效率更高,但也可以为特殊的场景应用而定制。
2024-05-22 23:52:10 277
原创 Redis——1、什么是缓存穿透
当前端向后端发送一条不存在数据的请求时,在数据库查询没有时会缓存到Redis中一个null值,这样,当前端再次发送同样的请求时Redis会直接返回null值,而不会去给数据库增加压力,从而解决缓存穿透的问题。为了解决Redis的负载压力,我们可以在请求发送至Redis前添加一个布隆过滤器,如果数据库中有请求查询的数据那么布隆过滤器会放行请求,如果没有则。具体实现过程:使用布隆过滤器,我们会将数据库高频访问数据预热到缓存(Redis)当中,同时预热布隆过滤器,然后布隆过滤器,将。
2024-05-22 21:08:31 433
原创 HashMap——4.HashMap中的扩容机制
加载因子默认设置为0.75时是因为JDK开发人员经过大量的测试后相比于设置其他值时空间利用率、查找效率比较好的一个值的结果。1、HashMap在JDK1.8之前存储元素的数组是在entry,1.8之后是在node中存储的,这两个数组的名字不一样但功能是一样的,它们都实现了。如果我们设置loadFactor的值为0.3
2024-05-22 17:30:23 671
原创 HashMap——3.HashMap中的加载因子、最大容量、以及红黑树的边界值
等方面的因素在节点数量小于8时更有性价比,在节点数量大于8时查询效率的优势会更明显的突出出来使我们忽略掉空间上的占用。为0.75,也就是说当节点在哈希数组中占用的空间超过75%时HashMap会进行扩容处理。,在哈希数组的一个bucket(桶、或者成为节点)中插入8个节点的概率是非常小的,故而综合。3、为什么会设置为8呢?时且数组长度大于64时链表会转为红黑树。2、红黑树的存储空间是普通链表的。1、当哈希数组中的节点长度。为1
2024-05-22 16:16:14 191
原创 4.2——JAVA基础-常用API类——StringBuffer和StringBuilder
String是字符串类,String的字符串对象一旦赋值之后字符串内容是不能变动的,如果需要变动还会涉及到对象的创建等等比较麻烦,这时我们就引入了StringBuffer和StringBuilder类,它们两个大致功能一样,但又各有其长处。因为是是线程安全的,所以有同步机制,使得一个线程去操作对象时,其他线程是不能同时去操作StringBuffer对象的由此依赖,效率就降低了。StringBuffer和StringBuilder在字符串的修改过程中并不涉及未使用的新对象的创建。
2024-05-22 15:49:50 182
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人