- 博客(75)
- 收藏
- 关注
原创 PriorityBlockingQueue的tryGrow方法
最近看PriorityBlockingQueue这个类的过程中,对扩容方法产生了一些困惑,特此记录下自己思索的过程。
2024-02-01 11:06:31
1006
原创 Lists.partition是如何实现懒加载的?
最近看到一篇文章,里面提及了google的common包下Lists.partition方法为懒加载,只有在遍历时才会真正分区。平时使用时并未感觉到,感觉有点好奇。特此将自己寻找的答案的过程整理记录下来。
2023-12-14 10:12:35
1082
1
原创 CopyOnWriteArrayList源码分析
CopyOnWriteArrayList 是一个线程安全的 ArrayList,它在每次修改(add/set/remove)时创建数组的新副本,然后将修改应用到新数组上。这是它名字的由来:“CopyOnWrite”。这种设计使得它在多线程环境下能提供更好的并发性能。当一个线程修改列表时,其他线程不能访问旧数组,因此不会受到数据不一致的影响。然而,写操作的代价是创建新数组并复制所有元素,这可能在大量写操作的情况下导致性能下降。
2023-11-08 17:49:59
188
原创 由一个单例模式引发的思考-holder类方式
最近在看《Java并发编程实践》,里面提到了一种实现单例模式的方式,并大致说明了机制,但仍不是很清晰,今日有空,查阅相关书籍,尝试解释其中道理。
2023-10-29 16:15:37
445
原创 关于Double中的NaN问题
其中红框部分,是抛出的异常,条件为Double无穷大或NaN,以前对Double的认识停留在浅薄的表面,遇到问题,才发现还有这两种情况。Double提供了判断两种情况的方式,还有其他的判断方法,有兴趣的可以自己查阅。最近在写代码时,因为涉及到计算,当时用了Double作为返回值,后续转成BigDecimal,但在测试过程中,发现有事会报异常:NumberFormatException:Infinite or NaN。1.可以用加入对NaN的判断。
2023-10-24 09:56:29
646
原创 从JVM方面解释java传递问题
Java传递问题,网上解释的比较多,大多是从代码和传递的规范的层次来解释。前段时间,自己也一直在思考这个问题,大部分的解释让我很难印象深刻,经常忘,刚好看过一点jvm方面的书,思考了一阵,觉得从jvm方面的这个解释更能让我印象深刻,废话不多说,直接上干货。
2023-10-24 09:33:42
436
2
原创 multipartFile.getInputStream()报空指针
尤其是在打开文件的情况下测试文件上传可能因为文件占用得不到io流,这种情况需要重新上传下文件。1.看文件名称和controller的入参名称是否一致。如果以上都没问题 可以在测试软件上将文件重新上传下。2.需要加@requestBoday。
2023-08-25 11:00:17
474
原创 java.lang.Long cannot be cast to java.lang.Integer解决
出错代码:接收泛型指定是Integer 但是在接测试中 频频抛出java.lang.Long cannot be cast to java.lang.Integer异常,debug 发现Map中的参数确实是Long类型的。该字段的值是count(*) 的结果,网上查了下count(*)的返回结果为BIGINT。应该是此原因导致的。使用父类的Number接收,在使用intValue()方法转成int。
2023-08-18 11:34:29
912
原创 Connection is read-only. Queries leading to data modification are not allowe解决
场景:用动态代理类调用本类中的事务方法后,又调用其他service的方法时,会抛此异常。解决方法:事务注解放在本类方法上,让处于同一事务下即可。初步认为是动态代理类影响了事务aop。
2023-08-02 10:50:13
476
原创 JSON parse error: Cannot deserialize value of type `java.util.Date` from String “2022-12-15 12:28:21
换为@JsonFormat( timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")将@DateTimeFormat(pattern = “yyyy-MM-dd HH-mm-ss”)在测试过程中发现从其他服务获取的日期数据(字符串类型)无法转为date,
2023-05-25 16:21:14
593
原创 《深入了解虚拟机》一书中关于对象优先在Eden分配的例子
同时S1区也是GC后存活的对象待的地方,那么它可能也就是引起提前GC的原因。一开始看到老年代占了40%,我以为数组4直接进入进入老年代,毕竟也算大对象,经过几次实验得出结论,在分配数组3时就已经触发GC了,老年代中的40%是数组1和数组2.此外 我们还可以更改数组1或数组4的大小进行验证 ,首先把4改为5MB,我们可以发现老年代中的大小并未概念,而E区的从78%->90%,验证了我们的结论。在我把里面所有的方法变量都注释后,还是会占28%的空间,也可以改数组1、2的大小,老年代的占比就会发生改变。
2023-04-04 11:32:08
87
原创 mysql 的自增id 是什么时候生成id的?
2.开启两个事务 一个提交 一个不提交。验证了结论,然后再把事务1的提交。1.关闭数据库的自动提交。
2023-03-17 11:19:06
283
原创 java的spi动态扩展
简单来说,就是服务的调用方定义一个接口规范,可以由不同的服务提供者实现。并且,调用方能够通过某种机制来发现服务提供方,并通过接口调用它的能力。说白了,Java中的SPI实现的就是,你按我的接口规范实现服务,我就能通过某种机制为这个接口寻找到这个服务。打包到本地仓库,sringboot项目打包时需要在插件出添加以下代码,否则导入包也无法使用类,详情请看本文章。目录,然后以前面定义的接口名创建文件,并在文件中写入实现类的全限定名。1.创建一个项目,定义一个智能空调的接口。,它所实现的其实是一种服务的发现机制。
2023-03-13 16:00:03
327
原创 Springboot:策略模式+工厂模式注入
在调试过程,一直在mapper调用查询方法时,报空指针。这块困惑了很久,最后才发现,我虽然在策略实现类上加了@Componen注解,但在使用工厂类得到对象。今天把项目中以前的代码优化了下,使用策略+工厂模式优化了下。,所以其中的mapper属性虽然有@Autowired注解,但属性实际是空的。使用的时候,在使用的类中也注入工厂就好了,用注入的工厂获取策略对象就行了。这是策略实现类里面的内容,需要用mapper用查询数据库。这是工厂,使用的时候根据id获取不同的实现类。获取具体的实现类时候,调用静态方法。
2023-02-09 15:53:13
2231
原创 设计模式-访问者模式
表示要在对象结构的元素上执行的操作。访问者可让你定义新操作,而无需更改其所操作元素的类。在面向对象的程序设计和软件工程中,访问者设计模式是一种将算法与操作对象的结构分离的方法。这种分离的实际结果是能够在不修改结构的情况下向现有对象结构添加新操作。考虑有一个带有军队单位的树形结构。指挥官下有两名中士,每名中士下有三名士兵。基于这个层级结构实现访问者模式,我们可以轻松创建与指挥官,中士,士兵或所有人员互动的新对象。1.定义单位和单位访问器类型。3.定义具体的访问者。
2023-02-07 08:36:58
97
原创 设计模式-模板方法模式
偷东西的一般步骤是相同的。首先,选择目标,然后以某种方式使其迷惑,最后,你偷走了该物品。然而这些步骤有很多实现方式。在一个操作中定义算法的骨架,将某些步骤推迟到子类。模板方法允许子类重新定义算法的某些步骤,而无需更改算法的结构。2.定义不同的方法子类实现。
2023-02-03 14:10:53
73
原创 设计模式-策略模式
定义一个家族算法,并封装好其中每一个,使它们可以互相替换。策略模式使算法的变化独立于使用它的客户。策略模式允许在运行时选择最匹配的算法。屠龙是一项危险的职业。有经验将会使它变得简单。经验丰富的屠龙者对不同类型的龙有不同的战斗策略。lambda策略实现。
2023-02-02 11:13:21
66
原创 设计模式-对象状态模式
目的:允许对象在内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式是一种允许对象在内部状态改变时改变它的行为的行为型设计模式。这种模式接近于有限状态机的概念。状态模式可以被理解为策略模式,它能够通过调用在模式接口中定义的方法来切换策略。程序示例:当在长毛象的自然栖息地观察长毛象时,似乎它会根据情况来改变自己的行为。它开始可能很平静但是随着时间推移当它检测到威胁时它会对周围的环境感到愤怒和危险。1.定义状态和不同的实现类2.定义猛犸象类3.测试输出类图:
2023-02-01 11:21:17
89
原创 设计模式-代理模式
想象有一个塔,当地的巫师去那里学习他们的法术。象牙塔只能够通过代理来进入以此来保证只有首先3个巫师才能进入。这里的代理就代表的塔的功能并添加访问控制。为另一个对象提供代理或占位符以控制对其的访问。使用代理模式,一个类代表另一个类的功能。1.巫师类和巫师塔接口与实现。
2023-01-31 09:26:47
90
原创 设计模式-观察者模式
在遥远的土地上生活着霍比特人和兽人的种族。他们都是户外生活的人所以他们密切关注天气的变化。可以说他们不断地关注着天气。定义一种一对多的对象依赖关系这样当一个对象改变状态时,所有依赖它的对象都将自动通知或更新。1.定义天气类型合观察者接口。2.实现各种的观察者。
2023-01-30 16:24:03
76
原创 syntax error, expect {, actual error, pos 1, fastjson-ve
序列化json的时候是用List转换的,解析的时候解析成对象了。
2023-01-13 08:58:45
1249
原创 设计模式-工厂方法模式
为创建一个对象定义一个接口,但是让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类。精灵需要精灵武器,而兽人需要兽人武器。根据客户来召唤正确类型的铁匠。
2023-01-12 16:19:40
80
原创 解决多线程事务问题
spring的声明式事务在多线程式,并不会生效。可以使用spring提供的编程式事务解决。亲测有效,至于网上的提供的一些 生成线程屏障的方法 试了下不行,也不知道是不是我的问题。第三步:将上面的放入多线程中,线程池和new 线程都可以。第一步:使用spring提供的编程式事务。核心思路是为每一个线程都开辟一个事务。第二步:在代码逻辑处写入业务逻辑。
2023-01-12 16:12:17
4243
5
原创 设计模式-简单工厂
在工厂类中提供一个封装的静态工厂方法,用于隐藏对象初始化细节,使客户端代码可以专注于使用,而不用关心类的初始化过程。工厂类是一个用于创建其他对象的对象 -- 从形式上看,工厂方法是一个用于返回不同原型或类型的函数或方法。
2023-01-09 16:50:31
87
原创 设计模式-门面模式
一个金矿是怎么工作的?“嗯,矿工下去然后挖金子!这是你所相信的,因为你在使用一个金矿对外提供的一个简单接口,在内部它要却要做很多事情。这个简单的接口对复杂的子系统来说就是一个外观。为一个子系统中的一系列接口提供一个统一的接口。外观定义了一个更高级别的接口以便子系统更容易使用。
2023-01-09 16:16:56
84
原创 设计模式-装饰器模式
附近的山丘上住着一个愤怒的巨魔。通常它是徒手的,但有时它有武器。为了武装巨魔不必创建新的巨魔,而是用合适的武器动态的装饰它。动态的为对象附加额外的职责。装饰器为子类提供了灵活的替代方案,以扩展功能。
2023-01-09 09:18:44
69
原创 设计模式-数据总线模式
(实际上,就是 Event-Bus 消息总线模式)允许在一个应用程序的组件之间收发消息/事件,而不需要这些组件相互感知,它们只需要知道所发送/接收的消息/事件的类型即可。
2023-01-09 08:56:33
586
原创 Currying(柯里化)
把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。以达成建造者模式效果为例,用2种柯里化方式完成。
2023-01-06 16:16:01
91
原创 设计模式-转换器模式
在真实的应用中经常有这种情况,数据库层包含需要被转换成业务逻辑层DTO来使用的实体。对于潜在的大量类进行类似的映射,我们需要一种通用的方法来实现这一点。转换器模式的目的是提供相应类型之间双向转换的通用方法,允许进行干净的实现,而类型之间无需相互了解。
2023-01-06 14:09:37
550
原创 设计模式-复合实体模式
对于一个控制台对象,需要管理许多接口功能。通过使用复合实体模式,将消息对象、信号对象等依赖性对象组合在一起,直接使用单个对象对其进行控制。复合实体模式用于对一组相关联的持久化对象进行建模、描述和管理,用于取代对这组对象描述为单独粒度的实体。
2023-01-06 10:55:40
127
原创 设计模式-组合模式
每个句子由单词组成,单词又由字符组成。这些对象中的每一个都是可打印的,它们可以在它们之前或之后打印一些内容,例如句子始终以句号结尾,单词始终在其前面有空格。将对象组合成树结构以表示部分整体层次结构。组合可以使客户统一对待单个对象和组合对象。
2023-01-05 18:09:28
59
原创 设计模式-命令模式
有一个巫师在地精上施放咒语。咒语在地精上一一执行。第一个咒语使地精缩小,第二个使他不可见。然后巫师将咒语一个个的反转。这里的每一个咒语都是一个可撤销的命令对象。将请求封装为对象,从而使你可以将具有不同请求的客户端参数化,队列或记录请求,并且支持可撤销操作。
2023-01-05 11:35:58
66
原创 设计模式-断路器模式
因此,如果其中一个远程服务缓慢或未成功响应,我们的应用程序将尝试使用多个线程/进程从远程服务获取响应,很快它们都会挂起(也称为 [线程饥饿]thread starvationopen in new window)导致我们的整个 Web 应用程序崩溃。我们应该能够检测到这种情况并向用户显示适当的消息,以便他/她可以探索不受远程服务故障影响的应用程序的其他部分。以这样一种方式处理昂贵的远程服务调用,即单个服务/组件的故障不会导致整个应用程序宕机,我们可以尽快重新连接到服务。
2023-01-04 18:09:08
194
原创 设计模式-业务委托模式
业务委托模式在表示层和业务层之间添加了一个抽象层。通过使用该模式,我们获得了各层之间的松散耦合,并封装了有关如何定位,连接到组成应用程序的业务对象以及与之交互的逻辑。手机应用程序承诺将现有的任何电影流式传输到您的手机。它捕获用户的搜索字符串,并将其传递给业务委托层。业务委托层选择最合适的视频流服务,然后从那里播放视频。
2023-01-03 16:53:17
156
原创 设计模式-建造者模式
想象一个角色扮演游戏的角色生成器。最简单的选择是让计算机为你创建角色。但是如果你想选择一些像专业,性别,发色等角色细节时,这个角色生成就变成了一个渐进的过程。当所有选择完成时,该过程也将完成。:将复杂对象的构造与其表示分开,以便同一构造过程可以创建不同的表示,为伸缩构造器反模式寻找一个解决方案。
2023-01-03 14:53:30
87
原创 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):(解决方法)
解决:启动类上加@MapperScan("com.*.*.mapper.**") 或@MapperScan("com.*.*.mapper")项目:springboot+mybatis-plus。或者每个mapper接口加@mapper注解。
2022-12-30 12:32:09
319
原创 设计模式-大使模式(Ambassador)
大使适用于无法修改或极难修改的旧式远程服务。可以在客户端上实现连接性的功能,而无需更改远程服务。创建代表消费者服务或应用程序发送网络请求的帮助服务。
2022-12-29 10:45:34
274
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人