自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 缓存与数据库双写一致性问题解决方案

并发读写情况下,如果刚删除了缓存,还未执行DB操作的情况下,读线程已经读取旧数据,更新缓存的值,那么数据库还是会出现不一致的问题,时间同样取决于过期时间长短。其实如果使用缓存,就会出现缓存和数据库的不一致问题,关键在于我们可以接受不一致的时间是多少,根据不同的需求采取不同的实现方案。第四种:基于第二种,先删除缓存,再更新数据库,为防止第二种情况的发送,使用保底策略,延迟一段时间,再删除缓存。做法简单,但是并发写情况下,会出现数据的不一致问题,具体不一致的时间长短取决于过期时间的长短。

2023-10-07 00:17:16 1132

原创 泛型的作用

最新反思:代码可读性大大增强,不知大家是否认同?

2019-08-08 17:53:48 118

原创 ReentrantReadWriteLock学习记录

state的高16位为读锁的线程个数,低16位标识获取写锁的过程中,可重入的次数。ReadLock和WriteLock是其内部类。

2023-09-12 13:55:09 56

原创 Tomcat及JVM性能调优

2.设置tomcat执行器(线程池),有以下参数:队列的长度(100),初始化线程数(50),最大线程数(500-1000),在server.xml中connector中指定对应的执行器。通过GCEasy分析gc日志,可以查看年轻代内存,老年代内存,元空间,吞吐量,平均停顿时间,最大停顿时间,执行GC的次数,MinorGC的次数,FullGC的次数以及对应的停顿时间。首先需要说的是调优,优化的是什么?即tomcat的吞吐量,单位时间内的并发访问数量,可以用jmeter工具压测当前系统的吞吐量以及响应时间。

2023-09-10 16:25:43 74

原创 《程序员的底层思维》第四章

成功往往是一时 的’而成长才是一辈子的’况且没有成长’也不会有真正的成功。而API又可以分为两种,一种是API的需求方,一种是API的提供方,需求方可以提供规范,交由系统去实现,另外一个是API提供方,往往是提供一个较为通用,不隐含细节的API服务。将复杂的问题,进行一个拆分,方便我们去维护,但是并没有明白其中所说的使用管道模式以及责任链模式也是分治思维的一种体现,但是作者使用xyz轴的方式去对分布式系统做了一个归纳,简单而言,x就是增加机器,提高并发,y就是领域维度的拆分,z就是数据维护的拆分。

2023-09-05 12:11:33 81

原创 Spring的循环依赖问题解决

目前的循环依赖,其实可以分为两种,一种是构造器的循环依赖,这种可以通过注解@Lazy懒加载的方式去解决,另外一种,就是属性的循环依赖,Spring为了解决这个问题,提出了三级缓存的概念,一级缓存放置生成的bean示例,且属性已经完成初始化,二级缓存防止属性未完成初始化的示例对象,三级缓存为了解决生成动态代理对象,且存在循环依赖问题的发生,其中防止的是生成代理对象的配置信息。

2023-08-23 12:35:24 24

原创 Spring的Bean的创建流程

2.从容器中获取bean,但发现不存在时进行初始化,封装成一个beanDefinition。1.从beanDefinition获取对象的需要设置的属性进行赋值。2.钩子,实现beanAware接口,重写方法进行执行。1.容器初始化时,对象的创建。

2023-08-23 11:41:06 23

原创 《程序员的底层思维》第三章观后感

在工作中,经常遇到这样的问题,比如这些代码可读性怎么这么差,怎么这么复杂,其中有一个原因自然是代码没有结构化,当我们通过抽象,将业务逻辑抽象为一个个自上而下的方法时,或许代码的可读性就会提升很多了。文字中对怎么形成具有结构化的内容,输出了两种方法,第一种,疑问回答分解,第二种,概括总结做聚合。具体我们在代码编写过程中,往往需要二者的结合,这样才可以写出优雅的代码。

2023-08-22 23:58:19 48

原创 《程序员的底层思维》第二章观后感

三要素:概念、判断、推理。

2023-08-22 09:45:07 57

原创 《程序员的底层思维》第一章观后感

涉及书籍《卓有成效的程序员》、《重构:改善既有代码的设 计》、可能真的人如同文字一样,恐怕只有经历了无数的不眠之夜,才可以造就这样的一本书吧。废话不多说了,大概总结写吧,希望自己也可以不断的思考,成为那个你想成为的人。

2023-08-22 09:11:25 127

原创 分布式锁ZK and Redis

第二点是可用性,ZK从CAP的角度去说的话,是保证了强一致性,没有保证可用性的,但是从分布式锁的角度考虑,并不会存在锁丢失的问题,而Redis主节点宕机的情况下,可能会导致锁丢失。2.如果获取锁失败,监听创建节点的上一个节点的删除状态,如果节点被删除,则判断当前节点是否为最小节点,如果是最小节点,则返回锁定成功,否则抛出异常。对于ZK而言,主要依赖于ZK的临时顺序节点以及节点的监听机制去实现分布式锁,下面以锁的lock()方法进行一个具体的叙述。b.在持久化节点的下面,创建临时顺序节点。

2023-08-21 17:57:47 24

原创 控制代码复杂性

工作有两年的时候,入职到了一家做供应链新零售的公司,刚开始接触的新项目并没有多少复杂性而言,代码优雅简单,但是一段时间后,做了公司的核心业务,大部分代码呢,都是在2019年编写,中间也只是修修补补,其中也遇到了相同的问题,就是代码的可控性不高,当有新的业务需求时,如果让一个新人去熟悉这个乱糟糟的东西,从中修修补补,可能时不时就会出现一些隐藏bug,主要原因在于业务太复杂,某些代码具有牵一发而动全身的功能。很难想象,工作4年的我,并没有一个合适的解决方案,直到看到了张建飞老师写的这篇文章,才醍醐灌顶。

2023-08-20 23:31:03 27

原创 Mysql的Innodb引擎的MVCC机制

但是对于Mysql底层而已,并不是使用增加两个字段的逻辑去实现MVCC,具体实现逻辑是这样的,在行记录的基础之上,增加了事务Id,以及回滚指针,通过回滚指针,指向上一条记录的UndoLog形成了版本链,在执行Sql语句查询时,生成了Readview(包含了当前正在执行的未提交的事务Id数组以及已经提交的最大事务Id),从而实现不需要加锁,就可以实现可重复读。

2023-07-14 10:00:44 36

原创 202. 快乐数

这儿唯一需要考虑的就是用set集合存储已经计算的数字,防止出现无线循环问题。

2023-07-13 14:10:49 32

原创 环形链表 II

相遇以后,重新赋值头节点为节点1,相遇节点为节点2,每次移动一个,相遇的点为环的入口。环形链表采用快慢指针,因为是相对运动,如果有环,快指针肯定会和慢指针相遇。

2023-07-11 15:17:34 33

原创 删除链表的倒数第 N 个结点

采用虚拟头节点应对这种去除头节点的特殊逻辑。

2023-07-11 13:52:48 23

原创 未来的你会怎么看待现在的我?

给未来的我的一段文字

2023-03-02 21:31:28 61

原创 构建者模式

目的:创建复杂对象当一个复杂对象由n个对象组成时,需要进行一系列的拆分,进行组装,形成大的对象。比如:当创建一个电脑对象时,电脑是由一系列的组件组合而成,比如鼠标、键盘、显示器,那么需要获取最终的对象,需要先创建一些小的对象。用实际项目中的例子举例如下:mybatis 在构建一个SqlSessionFactory对象时,设置了其Configuration属性,而Configuration对象是由n个小的对象组成的,这是调用XMLConfigBuilder的parse()去封装一系列小的对

2021-01-31 11:20:48 81

原创 插入排序

public class InsertSortVersion3 { public static void insertSort(int[] arr){ for (int i = 0;i<arr.length;i++){ insertIndex(arr,i); } } /** * 到x元素的位置都是...

2020-03-03 13:31:28 78

原创 冒泡排序的进化版-选择排序

public class SelectSortVersion3 { public static void selectSort(int[] arr){ boolean sort = false; int lastIndex = arr.length-1; while (!sort) { sort = true; ...

2020-03-03 13:30:02 87

原创 不一样的冒泡排序,通俗易懂

public class BubbleSortVersion6 { public static void bubbleSort(int[] arr){ // 默认未排好序 boolean sort = false; // 循环次数 每次确定的最值元素的位置 int lastIndex = arr.length-1; ...

2020-02-22 17:56:17 90

原创 Jsoup关键点记录

select选择器.class获取class属性#id 获取id属性select("a[href]") 获取带有href属性点a标签select("img[src$=.img]")获取以img结尾的图片attr("")获取属性对应的值...

2020-02-04 18:58:34 77

原创 LinkedList实现

package linkedlist;import java.util.LinkedList;public class LinkedListVersion2<T> { private Entry<T> first; private Entry<T> last; class Entry<T>{ p...

2019-12-28 10:33:58 62

原创 泛型之擦除

本章主要记录自己不断的思考,泛型的擦除是什么?进行泛型擦除的目的是什么?待真正理解之后,进行内容的补充。如果有自己见解的小伙伴,可以提前说说咯...

2019-09-09 23:42:29 66

原创 泛型之思考

之前偶然的灵光一现,认识到了泛型是可以增强代码的可读性的,但是泛型的目的应该并不仅仅如此吧,那么就泛型的出现,还给了我们什么样的便利呢?看到书上的总结,说的是泛型提供了编译期检查,避免了强制转型,当然也提到了增强了代码的可读性。对书中的这些东西,目前仅仅理解了增强代码的可读性,当我们在进行业务功能的开发时,合理的使用泛型,便于后期项目的维护,但是避免了强制转型?这真的是泛型的作用吗?其实还...

2019-09-09 23:24:39 88

原创 泛型,你惊到了我

泛型类代码实例:public class Teacher<T> { private T t; public Teacher(T t){ this.t = t; } public T getT() { return t; } public void setT(T t) { ...

2019-09-07 18:22:00 89

原创 生活就该如此

看某个博客看到的,挺喜欢这句话的,拿过来分享一下 可能很难,但是相信,坚持总会看到奇迹。 在结果还没有的时候,我唯一可以选择的就是努力奋斗,静下心来。 结果会慢慢的浮出水面。...

2019-08-18 21:08:56 113

原创 对1,2,3,4,5进行组合,写一个Java函数实现所有组合方式

今天的一道面试题,下面是代码,如果有更好的写法,欢迎分享;package com.suanfa;import java.util.ArrayList;public class Combination { public void f(int[] arr) { for(int i=0;i<arr.length;i++){ ...

2019-07-04 21:40:40 1468 1

原创 为什么重写equals必须重写hashCode呢

在理解这个问题时,我认为最先理解的应该是为什么会重写equals呢?理解清楚这个的前提下才有必要去理解为什么需要去重写hashcode!为什么需要重写equals方法呢?我认为是为了适应业务场景的需求而需要对类的equals方法进行重写,最经典的重写equals方法的例子莫过于String类了,在Object类中,其equals方法即“==”,比较的是对象在内存中的地址值。而String重写了...

2019-03-26 10:37:22 138

原创 为什么重写toString方法

toString方法来自于基类Object如下:public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode());}而我们为什么在自己创建的类中需要经常性的重写toString方法呢?应用&lt;&lt;Java编程思想&gt;&gt;中的一句...

2019-03-02 23:41:10 1154

原创 深层复制和浅层复制

        写作的目的在于表达自己的看法,与各位共同交流,希望发现自己写作中的不足,不断完善自我,当然,我的看法不一定是对的,希望各位用于怀疑,指出其中的不足,希望一同努力。         要理解深层复制和浅层复制,首先需要理解复制是什么?复制即在内存中给对象创建一个本地副本,当对本地副本的内容进行修改时,并不会修改原对象内容。对于深层复制,其生成的本地副本,修改任意对象的属性,都不会对...

2019-02-25 13:30:23 1183

原创 死锁,饥饿和活锁

线程的状态:1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就...

2019-02-24 16:04:16 301

原创 GC root的确定由来

《深入理解 Java 虚拟机:JVM 高级特性与最佳实践》一书中提到的 GC Roots 为:       1.虚拟机栈(栈帧中的本地变量表)中引用的对象;       2.方法区中的类静态属性引用的对象       3.方法区中的常量引用的对象       4.原生方法栈(Native Method Stack)中 JNI 中引用的对象。GC Roots,其主要目的在于根据可达性分析...

2019-02-16 16:18:07 1001

原创 Java类型转换

一:首先明白Java中的类型是什么?对于Java来说,类型可分为两大类,及基本类型和引用类型。而对于基本类型,有数值类型,字符类型,Boolean类型;对于引用类型,有类,接口,数组三种。二:为什么某些数值类型可以进行转换?请看如下的几段代码(1)强制转换int i = 30;byte j = (byte)i;(2)强制转换(损失精度)int i = 30000...

2019-01-22 12:22:27 94

原创 Redis持久化

一:简介核心目的:将数据从内存写入磁盘,以保证数据在Redis宕机之后,丢失大量的数据。1.RDB:定期的将Redis当前的数据保存进一个RDB文件。2.AOF:定期的将写入Redis内存的命令放入AOF文件中,由于Redis存储的数据是有限的,所以当内存中无法继续存放数据时,通过LRU算法,清除内存中的部分数据,当AOF文件达到一定程度时,会通过rewrite操作,使AOF文件中...

2018-12-10 21:45:16 166

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除