- 博客(17)
- 收藏
- 关注
原创 乐观锁和悲观锁
读取频繁使用乐观锁,写入频繁使用悲观锁。因为读取的时候不对数据产生影响,因此不需要担心数据冲突等问题,可以采取乐观锁;但在写入的时候可能会出现多个线程同时操作的问题,需要使用悲观锁来进行数据锁定,防止冲突。
2023-08-30 14:29:35
78
原创 HTTP 1.0 和 HTTP 1.1 的主要区别
3. 缓存处理:HTTP 1.0的缓存处理较为简单,仅支持通过"Expires"和"Cache-Control"头字段进行缓存控制,而HTTP 1.1引入了更多的缓存控制机制,如"ETag"和"If-None-Match"等。1. 持久连接:HTTP 1.0默认使用短连接,即每个请求/响应后都会关闭连接,而HTTP 1.1默认使用持久连接,在同一个连接上可以发送多个请求和响应。2. 请求管道化:HTTP 1.1支持请求管道化,即在一个持久连接上可以同时发送多个请求,而HTTP 1.0不支持请求管道化。
2023-08-30 14:10:12
2837
原创 Spring如何解决缓存依赖
循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。这里说的不是函数的循环调用,是对象的相互依赖关系。循环调用其实就是一个死循环,除非有终结条件。Spring中循环依赖场景主要有以下两种:(1)field属性的循环依赖(2)构造器的循环依赖(3)DependsOn循环依赖。
2023-08-22 17:35:48
133
1
原创 Spring事务失效的原因及解决方法
因为spring声明式事物是基于AOP实现的,是使用动态代理来达到事物管理的目的,当前类调用的方法上面加@Transactional 这个是没有任何作用的,因为调用这个方法的是this,没有经过 Spring 的代理类。解决方法:@Transactional 修饰public方法即可,或者@Transactional 修饰类,需要事务生效的方法都为public。要注意的是单纯使用cglib代理是不会出现事务失效的情况,只有当接口层使用声明式事务同时使用了cglib代理才会出现事务失效的情况。
2023-08-22 15:45:16
460
1
原创 事务传播行为
但如果是事务二回滚报异常,那么事务一也会宝异常,因为事务二是在事务一内部的,事务二的异常可能会被事务一捕获。修饰的内部方法属于外部事务的子事务,外部主事务回滚的话,子事务也会回滚,而内部子事务可以单独回滚而不影响外部主事务和其他子事务。创建一个新的事务,如果当前存在事务,则把当前事务挂起。作用相同,修饰的内部方法都会新开启自己的事务,且开启的事务相互独立,互不干扰。修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。
2023-08-22 15:10:46
255
1
原创 Java中的CAS机制
这时内存中的变量 p 的值为101,然后B再写回,也会进行比对,发现 p 的值为101,和自己记录的100不相等,那么这次写入就是失败的,这次数据也就不会再去写入。在不加限制的情况下,很可能发生的一种情况是:线程A和线程B同时读走了此时变量 p 的值(假设为100),各自++操作,然后拿着各自的 p (101)来写回。这个时候线程A先写回,内存中的 p 变成了101,然后线程B再写回,不管内存中的 p 的值是多少,直接写回为101。但这个流程是不对的,变量 p 的值是发生过改变的。
2023-08-22 09:09:43
83
1
原创 Java中的volatile关键字
在多线程的情况下,如果我们需要做一些比较简单的操作,比如++操作,而且要执行多次,这时候就可以选择volatile关键字,效率会更快一些,但无法保证原子性;而synchronized关键字就更能保证线程安全一些,不过有造成线程阻塞的风险,适合比较复杂但低频的操作。
2023-08-21 14:19:16
199
1
原创 JVM垃圾回收机制
在 JVM 进行垃圾回收之前,首先就是判断哪些对象是垃圾,也就是说,要判断哪些对象是可以被销毁的,其占有的空间是可以被回收的。根据 JVM 的架构划分,我们知道, 在 Java 世界中,几乎所有的对象实例都在堆中存放,所以垃圾回收也主要是针对堆来进行的。更直接的说法就是:垃圾就是不可能再被任何途径使用的对象。因为这些对象不会再被使用,也就没有了存在意义,自然是需要被清理掉的。
2023-08-20 14:43:15
449
1
原创 浅谈JVM类加载器和运行时数据区
每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个线程都有一个独立的程序计数器,线程的阻塞、恢复、挂起等一系列操作都需要程序计数器的参与,因此必须是线程私有的。本地方法栈:与虚拟机栈作用相似,只不过虚拟机栈为执行Java方法服务,而本地方法栈为执行Native方法服务,比如在Java中调用C/C++。堆:Java虚拟机所管理的内存中最大的一块,唯一的目的是存放对象实例。类的加载是通过双亲委派模型来完成的,双亲委派模型即为下图所示的类加载器之间的层次关系。
2023-08-19 20:04:51
381
原创 Redis异常之雪崩、击穿、穿透
缓存穿透指要访问的数据既不在缓存中也不在数据库中,这样也就导致了缓存中没有数据去数据库中查询,但是数据库中也不存在该数据,就不会写到缓存中,这样一来缓存就成了摆设,如果大量请求这种不存在的数据,对缓存Redis和数据库来讲都是压力巨大的。Redis雪崩其实大多数人都知道其中的一个原因便是缓存集中过期,一般都是设置过期时间的时候统一将一批数据设置相同的过期时间,在某个点集中过期,导致大批量的请求打到缓存后面的数据库,导致数据库压力巨大,无法及时处理大批量的请求。
2023-08-19 19:04:17
205
原创 JVM中锁的升级
状态(这个时候的锁虽然是降级了,但不是持续性的,在降为无锁状态后,需要再次标记下一个线程的对象头,也就是再次转变为偏向锁,因此从宏观角度来看,依然是没有降级的情况发生的);在锁膨胀为重量级锁之后,该线程会强行将锁资源抢夺过来,这时之前获取到锁的线程就会释放锁并被阻塞,等待锁被释放后重新唤醒并再次竞争锁。今天我们要说的是JVM内部实现的锁的几种状态,它们之间是有级别区分的,从低到高的顺序是:无锁、偏向锁、轻量级锁、重量级锁。偏向锁每次切换线程都会被记录次数,在达到20次之后就会升级为轻量级锁。
2023-08-03 20:47:58
317
原创 什么是异或
对于异或之前在学习的时候有学过,但后来很少用到,恰巧今天在做题的时候发现用异或会变的很简单,同时复杂度会降得特别低,这激起了我对异或的兴趣。异或运算其实就是两个相同的数异或就是0,然后0和任何数异或得到的结果就是这个数,1和任何数异或得到的都是这个数取反。执行结果如下:这就很方便我们在很多有相同数的运算中来操作了。例如本题:一个数组中除了某个特定元素只出现一次,其他元素都出现两次。找出该特定元素。
2023-07-27 16:57:54
501
1
原创 Java字符串的大小写转换
上面的两个方法不是String类独有的,Character类也有,用法和String类略有差别。String类是用字符串对象调用这两个方法,而字符是通过Character类去调用这两个方法,然后需要被改变的字符作为参数传递进去。在做题的时候有一道用到字符串转换大小写的题目,经过查找String类的方法发现Java中的String类有专门的方法来进行大小写转换。String类用来大小写转换的方法是: toLowercase() 和 toUppercase() 方法。
2023-07-27 16:26:46
943
1
原创 初识Java中的transient关键字
最近开始喜欢上了扒源码,今天在用HashMap的时候忽然想去观察一下源码,分析的时候发现了transient这个关键字,在我的学习过程中其实还没怎么遇到过这个关键字,直接就激发了我的好奇心,经过查阅网上的资料发现,这是和序列化相关的关键字。在我们编写代码的过程中所使用的很多对象都是需要实现Java.lang.Serializable接口的,不实现的话在写入磁盘的时候会抛。被transient修饰的变量在被读取的时候是不会被序列化的,也就不会再占用我们的磁盘内存了。接下来就是我们今天的主角了。
2023-07-25 21:06:40
153
原创 从源码角度分析HashMap中的put方法的基本流程
而其他的分别是我们调用put方法时的key,value的值。在return的时候使用了一个三元运算符,先进行了一次null值判断,如果key值为null则直接返回0,否则,先对变量h赋值为key的hashCode值,并将h右移16位,这个右移的操作叫做扰动函数,是为了让我们hashCode中的值更分散,减少hash冲突。HashMap是我经常会用到的一个很实用的类,之前用的时候只是知道HashMap的复杂度是log(1),很方便查找,多次使用之后决定来分析一下源码,多了解一下这个类的细节。
2023-07-25 20:48:27
208
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人