- 博客(39)
- 收藏
- 关注
原创 对锁的理解
自旋锁实际上是一种乐观锁的实现,通过CAS原理来进行相应操作,在对当前状态做完操作时,对原有状态做保存,修改前会比较再读取到的值是否和我保存的值一致,一致就更新,结束操作;采取一种乐观的态度,一般情况下认为大部分情况是不进行修改操作的,但是最终会判断当前是否做了修改,如果不一致就进行加锁操作。采取一种悲观的态度,默认只要有操作都是会对当前状态进行修改的,所以无一例外都先加锁。写锁:在进行操作时,除了不允许其他线程进行写操作,也不允许其他线程读操作。大粒度的锁,解决死锁的场景。
2024-03-22 18:11:47
281
1
原创 面试心得总结ing版
CopyOnWriteArrayList是线程安全的的List接口的实现类,采用了Reentrantlock锁对增、删、改操作加锁,对读操作不加锁的,也就意味着CopyOnWriteArrayList实现了读写分离,适用于读多写少的的场景,在写操作时是通过复制出新数组,再将修改后的值挪过去达到目的的,所以会带来内存上的消耗,效率比Vector高,但是允许读写分离也就意味着,它会出现数据不一致的情况,保证的是数据的最终一致性,而不能保证数据的强一致性。(1)前者是对整张表加锁,占用资源少,不容易产生死锁;
2023-12-26 00:04:00
686
原创 delete、drop、truncate三兄弟
记录行数据页数据+表结构操作定义定义效率语法SQL中命令的分类:DMLDDL表结构DCL数据库用户角色权限。
2023-10-22 22:24:59
401
原创 计算机网络的相关知识点总结
如果没有这第三次的确认,如果客户端由于网络延迟或其他原因导致的未及时发送请求连接的数据包,有可能就会再次重新发送请求连接的数据包,服务器端收到并同意连接,而此时第一个未及时发送的数据包又正常发送了,势必会导致服务器的再一次同意连接,这就导致了重复的连接,造成了不必要的资源浪费。第二次握手:服务器被动打开接收客户端发送的建立连接请求的数据包,若服务器同意建立连接,则向客户端发送一个ACK确认=1,SYN同步=1的数据包,此时服务器转换为接收状态;TCP协议的四次挥手是为了释放收发双方的连接的。
2023-09-22 18:11:42
462
原创 ThreadLocal线程局部变量
因为ThreadLocal对象只属于当前线程,那么ThreadLocal中的数据也属于当前线程,在多线程并发的情况下,很好的实现了不同线程的数据隔离,避免了采用synchronized锁机制来保证线程安全而导致的性能上的代价。计算得到的,操作ThreadLocalMap是以当前的ThreadLocal作key,通过当前的key的HashCode值和Entry[]数组长度-1作“&”运算,来计算出实际操作位置的下标,从而达到访问元素的目的。ThreadLocal中保存的数据仅属于当前线程)。
2023-09-18 16:53:05
238
原创 对数据库三大范式的理解
首先,要明确一个概念,范式的提出到逐步精进,从第一范式到第三范式,甚至于BCNF范式,逐步优化是为了解决插入异常、删除异常以及改善数据冗余的。
2023-09-14 10:13:21
370
原创 消息中间件-RocketMQ
la RocketMQ是阿里巴巴开源的消息分布中间件,在阿里内部使用非常更广泛,已经经过了“双11”这种万亿级的应用场景考验。
2023-09-12 23:11:42
252
原创 一道很有趣的C语言题
i=1,满足i4;i++为2,仍满足循环条件,继续s[i]中等于2的有3个,即c[2]的值为3;依次类推下去,直到i=4输出完c[4]的值后,i++不满足循环条件退出内层循环;i=5然后一直++,直到不满足i
2023-09-10 22:09:37
180
原创 【力扣练习题】加一
这里将字符串转成int类型时,不要直接用int接收,因为可能会存在超出int范围(-2147483648~2147483647),可以采用BigDecimal来接收,就不会报“Exception in thread "main" java.lang.NumberFormatException: For input string: "98765432101"at java.lang.NumberFormatException.forInputString(Unknown Source)”这个错误了。
2023-09-09 11:29:55
337
原创 对Spring核心思想的理解(二)
在IAccountService这个接口中,有许多方法充当连接点,而需要添加共同逻辑的方法save()、updateById()、transfer()即为切点,切面即由具体的实现共同逻辑的代码及内部调用需要添加共同逻辑的方法构成。2.连接点(joint point):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。的逻辑(例如:事务处理、日志管理、权限控制)封装成可重用的代码块,以此来。即接口中所有的方法,
2023-09-09 00:31:02
137
原创 级联查询(注解版)
在mybatis的XML版,给我们提供了一种解决方案,可以通过定义ResultMap来定义返回结果集,再加上连接(JOIN)表操作就可很好的解决问题。在编写具体数据访问层时,遇到了一个问题,返回一行数据ResultMap集合可以写(用一个具体的对象来对应),多行数据呢?所以我们想到了利用级联查询,来嵌套调用具体DAO的方法实现五表的查询。一级一级的调用不同的数据访问层方法,来达到多表查询的目的,这就是级联查询。的查询时,我们往往就要思考多表关联,表与表之间的。
2023-09-07 16:29:28
290
2
原创 对Spring核心思想的理解(一)
Spring有两大核心思想:1.控制反转(IOC)依赖注入(DI)2.面向切面编程(AOP)先说Spring的第一大核心思想,“控制反转 依赖注入”,这八个字究竟是什么意思呢?控制反转是指将创建对象的权力交由Spring容器来管理,依赖注入则是指应用程序运行时,每一个Bean对象都依赖Ioc容器注入当前Bean对象所需要的另一个Bean对象。该思想很大程度上使降低了项目组件之间的耦合关系,实现了解耦。Spring IOC容器就是利用控制反转-依赖注入的思想来创建并管理Bean。
2023-09-05 23:58:47
105
原创 构建微服务项目时启动网关服务失败的解决方案
启动网关服务时报“Unable to create the temporary folder: C:\WINDOWS\TEMP\/nio-file-upload”错误。
2023-09-03 23:44:17
558
原创 如何从Git上拉取项目
选中项目右击 Git --->Resposity,切换分支branch、更新本地仓库pull、推送至远程仓库push里操作。创建新分支的目的,你自己对当前代码做的修改不会影响到主分支(master),以便他人使用,最后合并分支就完成汇总了。输入相对应的远程仓库地址,执行命令后本地仓库(当前文件夹下)就成功拉取到远程仓库的项目了。你首先要做的是在本地磁盘建立一个本地仓库文件夹,用来存放你从远程仓库克隆下来的项目。它实现多人协作的机制是利用。做完相应的代码更改后,先更新本地仓库的项目再推送至远程服务器。
2023-09-03 13:00:54
17216
原创 Spring框架中的注解
注:即作用域为多例,每次getBean时都会创建实例对象。若省略value= "id" ,默认注入id为。若省略value= "id" ,默认注入id为。若省略value= "id" ,默认注入id为。一、注入类(用于声明Bean的注解)三、声明配置、扫描、启用特性的注解。= "id" ,默认注入。@Value("数据")类的名称且首字母小写。类的名称且首字母小写。类的名称且首字母小写。类的名称且首字母小写。
2023-08-29 21:32:39
89
原创 Redis
首先了解一个概念:缓存预热,在系统启动前,提前加载相关的缓存数据库到缓存系统,避免用户在请求时,立马调用数据库进行查询,然后再将查询到的数据库缓存的问题。Redis是内存数据库, 需将内存中的数据库状态保存到磁盘,否则一旦程序退出数据库状态也会丢失。事务在执行的过程中,不会被其他客户端发送过来的命令请求打断,Redis事务的主要作用即串联多条命令。Redis中开启事务,包含在内的所有命令都会被序列化,执行时按顺序执行。2.利用布隆过滤器,即变相的限流了。,缓存永远不会生效,导致请求全指向数据库的情况。
2023-08-27 23:35:28
190
原创 如何避免死锁?
谈到死锁的避免,就不得不先清楚什么是死锁?会在什么状态下产生?看下面一个案例:有一个DeadLock类:该类中有两个方法,add和dec,两个方法都需要两把锁 lockA,lockB,只是获取的先后不同。//创建2个Object类型的对象充当锁//add()方法synchronized (lokckA) {//获取lockA的锁//线程休眠,保证dec()方法抢到lockB锁synchronized (lokckB) {//获取lockB锁。
2023-08-26 00:26:32
299
原创 对Spring MVC工作原理的理解
Spring的三层架构,Controller控制层、Service业务层,dao数据访问层。数据访问层是直接操作数据库的,而控制层是联系视图层与业务层的,业务层又将控制层和数据访问层串联起来。MVC是一种设计模式,而Spring MVC是一款基于MVC设计模式思想实现的MVC框架,属于spring技术栈的一部分,它是来帮助我们。从图中可以看出,控制层的实现依靠了Spring MVC设计模式,那我们就来了解一下Spring MVC内部的的实现原理。等流程节点分离的思想来组织代码的。的,更有利于架构的设计。
2023-08-22 22:45:06
178
1
原创 初步认识Redis
hincrbyfloat (浮点数)key field increment。redis自身是一个Map,其中所有数据均采用 key : value的形式存储。hincrby(整数) key field increment。数据类型是指存储的数据的类型,即value部分的类型,key start stop (获取当前key。(9)设置数值数据增加减少指定范围的值。(8)设置指定字段的数值数据增加指定范围的值。(10)设置数据的生命周期。(8)先get然后再set (
2023-08-21 23:56:42
158
1
原创 synchronized锁的优化
synchronzied同步锁保证线程安全依赖于操作系统的互斥锁(Mutex Lock),消耗资源的同时还需一直等待,没有额外的尝试获取机制,不过在java1.6以后进行了优化。
2023-08-20 20:17:07
447
1
原创 利用mybatis框架搭建Ecplise项目执行相应SQL操作
首先相较于JDBC操作数据库而言,Mybatis框架操作数据库降低了代码的冗余,开发人员只需要关注SQL语句本身。Mybatis的内部封装了JDBC,是基于ORM(Object Relational Mapping)的半自动化实现。mybatis的核心是其更多的采用了.xml文件和映射器接口来实现相应的数据库连接、SQL语句生成以及调用方法。
2023-08-15 08:00:00
380
原创 《ReetrantLock与synchronized的区别》
因其可重入,synchronized在获取锁时,不管是第几次获取,没获取一次锁,记录是+1,执行完synchronized代码块,记录数-1,直到记录数为0才。策略获取锁,当资源空闲时,它总是会先判断sync队列是否有等待线程时间更长的线程,如果存在,就将当前线程加入到等待队列的尾部,实现了公平机制。的情况下,synchronized是不适用的,于是从Java 5开始,引入了ReetrantLock锁,它位于。策略获取锁,每次都尝试获取锁,不会按照公平等待的原则进行等待,不会让等待时间最久的线程获取锁。
2023-07-19 23:28:25
112
原创 《线程池的执行流程》
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池内部维护了若干线程,没有任务的时候,这些线程都处于等待空闲状态。如果有新的线程任务,则线程池会分配一个空闲线程执行。如果所有线程都处于忙碌状态,线程池会创建一个新线程进行处理或者放入队列(工作队列)中等待。
2023-07-19 00:03:23
213
原创 线程的创建方式
查阅Thread源码你会发现,Threa的有参构造方法中没有与Callable实现类有关的构造方法,而SumCallTask的功能是实现指定范围内的计算任务的,是需要有返回值的。由一个以上的线程组成的程序称为多线程程序。在通过所创建的线程池对象的execute()方法向线程池提交一个执行任务(创建一个Runnable接口的匿名实现类),线程池会自动分配一个空闲线程执行该任务。单线程是进程中只有一个线程,单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的线程必须处理好,后面的才会执行。
2023-07-16 20:54:50
396
1
原创 AES算法
对称加密算法就是传统的用一个秘钥进行加密和解密,我们常用的WinZIP和WinRAR对压缩包的加密和解密,就是使用对称加密算法。OFB(Output feedback:反馈模式),OFB是先用块加密器生成密钥流(keystream),再将密钥流与明文流异或得到密文流,解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文。ECB(Electronic codebook:电子密码本模式),是最简单的AES加密模式,它需要一个固定长度的密钥,固定的明文会产生固定的密文。1.将一前段加密得到的密文再加密。
2023-07-16 19:31:57
1150
1
原创 利用java反射机制实现动态代理
1.动态代理实现了更好的代码复用。2.java反射机制(运行时动态)是动态代理的关键。3.充分理解invoke()方法的实现机制和作用。
2023-07-15 00:32:11
322
1
原创 Java反射机制部分总结
Java反射机制是指是在运行期中,对于任意一个类,都能够得到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。根据类名,就可以通过该类的newInstance()方法创建对象。1.JVM在执行Java程序的时候,并不是一次性把所有用到的class全部加载到内存,而是第一次需要用到class时才加载。2.通过getConstructor(传入参数类型的不同)得到有参或者无参(不传参)构造方法。
2023-07-13 00:30:40
534
1
原创 浅谈哈希算法
1.哈希算法用于验证数据完整性,仅支持单向传递(加密),不可逆。2.常用的哈希算法MD5、SHA-1,RipeMD-160算法。3.用户哈希存储口令时要考虑彩虹表攻击。目录一、概念二、哈希碰撞三、常见哈希算法1.MD5算法1.1 加密普通字符串完整代码1.2 加密图片2.SHA-1算法3.RipeMD-160算法四、哈希算法用途1.校验下载文件2.存储用户密码五、总结。
2023-07-10 19:35:26
551
1
原创 基于FTP服务器的文件操作
1.文件的显示可以显示不同目录下的文件列表2.文件的上传下载均需要设置文件的类型3.创建输入、输出流记得要关闭。
2023-07-10 00:21:20
1125
1
原创 利用java工具实现发送Email
电子邮件出现之后,类似的也是模仿这个原理,不过不是具体的纸质信件而是通过从发送方用户的电脑端的邮件软件,发送到邮件服务器上,经过若干个邮件服务器的中转,到达接收方用户的电脑端软件,接收方通过登录相关的Email软件来查看邮件内容。通过Session的getInstance()方法创建session实例,传入保存SMTP配置信息的Properties对象p,以及创建一个新的Authenticator对象用于服务器的认证(传入用户名和密码)。这里就需要了解一个网络编程的协议,SMTP协议,简单邮件传输协议。
2023-07-09 00:09:46
800
1
原创 《HashMap的数据结构》
当哈希表中容量大于该值才会树形化(转化为红黑树)//哈希表的最小树形化容量//加载因子讲阈值之前:首先明确一点,HashMap中,阈值=容量*负载因子举个例子:若当前HashMap中容量为16,负载因子默认为0.75,那么当size(元素个数)达到16*0.75=12时就会触发扩容。当桶中元素个数超过该值是,将链表树形化,需使用红黑树节点替换链表节点。//扩容阈值扩容时,元素个数小于该值即将树形的桶元素还原为链表结构。
2023-05-30 11:35:09
333
1
原创 关于Python中pip install 各种包下载不下来的问题解决办法
2.此时不要输入pip install xxx(包名),而是在install后增加 Python对应的路径下的Lib下的site-pages 目录。你们有可能报安装不成功或者下面这个问题(win+R,输入cmd打开命令窗口。1.首先找到你Python的安装路径。以我的为例:我选择的路径是第二个。
2023-05-10 10:07:14
3477
1
原创 对LinkedList源码的粗略解读
首先观察LinkedList类开头的定义可知,LinkedList继承自AbstractSequentialList泛型类,实现了List、Deque(双端)、Cloneable(克隆接口)、Serializable接口(序列化接口)。AbstractSequentialList继承自AbstractList抽象类,其内部定义了根据索引拿到和设置对应位置值的方法,以及根据索引添加、删除一个元素的add、remove方法,还有添加多个元素的addAll方法等,感兴趣的可以去阅读相关源码,这里不多赘述。
2023-04-27 21:51:07
373
4
原创 对ArrayList扩容方式的理解
ArrayList是基于数组实现的列表,是List(有序且值不唯一)接口下的一个实现类,关于ArrayList的扩容,我查看了一下源码。又定义了一个int类型变量newCapacity,表示扩容后的容量(新容量),扩容为原来(oldCapacity)的1.5倍。如果 新容量 仍小于 所需最小的容量,将所需的最小容量minCapacity赋值给扩容后的容量newCapacity;首先创建ArrayList类型的列表时,如果未指定初始容量(capacity),该类会默认定义初始容量为10。返回值为新容量大小。
2023-04-25 23:48:10
230
1
原创 关于Anaconda中Jyputer Notebook启动后不自动跳转网页Juypter问题的解决
webbrowser.register('A',None,webbrowser.GenericBrowser(u'复制粘贴你想设置的浏览器路径'))我之前打开后不启动,就手动复制粘贴http://后面的网址在浏览器打开,每次这样很麻烦。ps:给大家推荐一个在电脑上快速搜索各种软件、文件的小工具(Everything)注:A即浏览器路径末尾\A.exe前的A(你的.exe前是什么就替换成什么)2.输入下面这行代码,第一次需输入N(输入时空格看好)3.在你的电脑上找到这个文件,用记事本方式打开。
2023-04-19 00:03:01
1437
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人