- 博客(27)
- 收藏
- 关注
原创 从零开始手写Lock4j框架(二)
接上一篇, 在上一篇中我们实现了一个大体的架子, 功能其实已经差不多了, 也非常接近V1.0.0版本了, 但是还有几个问题, 今天我们要解决一下。
2024-06-28 11:51:17 753
原创 从零开始手写Lock4j框架(一)
首先, 我们自定义一个注解, 就叫@Lock4j吧, 那么这个注解里应该有什么属性呢?我们利用redis实现分布式锁的原理, 大家都知道吧(不知道的百度一下啊, 这里偷个懒)。首先我们肯定需要一个key, 作为redis中的key。其实在不考虑这么多的情况下, 一个key就够了!是的, 你没听错。本身原理就是redis设置一个key, 谁设置了谁就获取了锁呗!但是这里我们还是多考虑一点吧, 比如一个应用获取了分布式锁, 然后卡住了, 或者挂了, 锁释放不了了怎么办?所以, 应该引入一个过期时间(
2024-06-25 14:41:19 658
原创 代码整洁之道第3章-函数
函数应该尽量小 在从业生涯中我见过最长的一个函数是几千行, 那简直就是程序员的噩梦, 所有的逻辑耦合在一起, 想要搞明白这个函数都干了什么还真要费一番功夫。更有甚者, 连原作者有时候都得重新梳理一下。造成这种情况的原因就是对函数没有整体的规划, 对于函数我们不能像写作文那样, 直抒胸臆, 挥毫泼墨;要明确抽象的层次, 比如造飞机这个函数来说, 应该把机头啊, 机翼啊这些的创建放在第一层函数内, 细节下沉, 逐步细化, 这样才对。
2024-05-07 11:43:36 746
原创 代码整洁之道第2章-有意义的命名
书中第二章名为"有意义的命名", 主要是讲的对变量, 类, 函数等的命名;我将书中的条目大体归纳为以下这些方面简明扼要既要"简明", 还得"扼要";这四个字做起来很难的?命名既要能表达完整的含义, 又不能太过啰嗦。这个其实对应了书中的好几个条目。要做到这一点前提就是杜绝没有任何意义的命名, 如ai, 当然作者也说了如果只是在方法内, 比如循环中, 用个i啥的也无所谓;再然后就是要结合当前的语境进行合理的命名;
2024-04-24 15:36:09 701
原创 代码整洁之道第1章-整洁代码
这里作者列举了很多名家名言来说明什么是整洁代码, 最后也谦虚的表示他的观点和做法也仅仅是一家之言, 仅供参考, 至于作者定义的整洁代码, 就是本书接下来的一条又一条的规则和建议。
2024-04-22 14:49:33 364
原创 ThreadLocal源码解析(2)
在上一篇中我们分析了Thread以及的关系, 这一篇我们继续分析中的Entry类以及剖析一下的内存泄漏问题。
2024-04-18 23:09:49 774
原创 mysql中show index命令的使用
在阅读阿里云公众号的一篇文章的时候, 发现了一个show index命令, 因为之前没有用到过, 特此记录一下。
2024-04-17 09:36:08 536
原创 seata注解@GlobalTransactional原理探究
今天分析一下seata中怎么通过一个@GlobalTransactional注解实现全局事务的, 其实大家应该也能猜到是基于AOP, 在开发中当需要配合注解的时候我们往往想到的就是AOP。
2024-04-15 17:37:22 1500
原创 一文搞懂23种设计模式, 再不会来找我
应用于某些场景的压根就不用管它我们只记三大特性和六大原则就已经掌握了大部分的设计模式要了解任何事物, 方法论很重要, 形式的东西无所谓。
2024-03-01 16:48:51 936
原创 一个java程序员对AI的看法
如果你想借着东风转行, 那么这和上述的第一点也不冲突(那是个了解, 自己动手玩AI的过程). 作为一个java程序员, 我们应该掌握chatGPT以及其他大模型或者后续的其他领域AI的常见API, 并将我们的软件工程类的思想与之结合, 想象一下将AI作为最下层(将计算机作为最下层, 有了机器语言程序员;现在将AI作为最下层, 这就是AI应用程序员). 作为java程序员, 我们最擅长的就是工程化思维, 怎么利用AI做软件, 做工程, 将prompt作为接口, 将AI下沉, 建立起面向AI的应用;
2024-02-27 09:06:52 340
原创 已经启动的docker容器忘了run参数了怎么办
接上一篇, 还是那个小伙伴的问题, 我使用whaler反推出Dockerfile之后, 重新build了, 执行run命令需要哪些参数呢?要不怎么说坑呢?刚开始我用的, 能看到一些映射和端口的信息, 但是屡清楚这些并且还得自己整理命令费劲啊!本着的原则, 我认为肯定有这样的工具来解决这个问题. 噫, 查了之后还真有, 这个工具名字叫做runlikedocker别名的使用如上面将docker run命令, 自定义了一个别名, 这样下次用起来方便, 关于别名的具体用法和注意就不展开了, 小伙伴们自己查一下吧。
2024-02-23 11:45:30 446
原创 docker镜像反向生成Dockerfile
一天, 接到了一个小伙伴的求助, 他接手项目的甲方, 让他帮忙启动一下之前乙方遗留下的系统(那个乙方已经撤了, 现在换成他们了), 但是之前的项目是用docker进行部署的, 他不太懂, 所以来问我;说实话我对docker也是一知半解, 关系挺好, 不好意思推辞, 接了下来.接下来之后, 我就登上服务器看了看, docker正在运行着, 但是项目没启动成功;但是之前的乙方已经走了, 找了很久也没找到Dockerfile之类的. 去网上查, 让执行。, 而且使用起来非常简单, 下面介绍一下怎么使用。
2024-02-23 11:07:05 631
原创 订单状态没了, 老板问我闹哪样
我又去数据库看了下,发现数据库中的类型是tinyint(1), 而这个类型查询后在Mybatis-Plus中转换为了boolean类型,我也不知道是Mybatis弄的还是plus弄的,抑或是JDBC就是这么映射的,这种映射关系能不能修改,这些暂时还没研究(有没有大神能详细的讲一下最后我的处理是把数据库中的字段改为tinyint(2)
2023-12-19 15:07:52 957
原创 这个bug, 差点让我跑路
没想到啊 没想到 没想到啊 没想到这要是我自己写的代码真没有这种问题, 我都是习惯查询出整条数据, 然后设置属性更新;而这位同事偏偏喜欢这样, 也没法说。小伙伴们你们平时更新数据都是哪种方式, 欢迎评论!
2023-12-15 15:13:39 929
原创 异步, 事务回滚了怎么办?
大家经常会遇到这样一种场景, 就是某些不太重要的任务可能放到线程池里异步执行, 这样能提高效率和请求的吞吐量可是, 大家有没有考虑过一个问题, 如果主线程的任务回滚了, 但是异步任务已经提交到线程池了怎么办呢?今天来介绍一个方法。
2023-09-18 09:36:06 314
原创 @EnableAutoConfiguration和@ImportAutoConfiguration的区别
是加载所有的自动配置类, 这其中包含了缓存, JPA等功能的自动配置类为key的自动配置类而加载自定义属性classes中的配置类集合或者某一独立功能的自动配置类集合(如因此的相比较而言, 更加灵活, 并且实现了对自动配置的范围定制。
2023-06-27 17:30:47 660
原创 SpringAMQP之RabbitAdmin类详解
经过前面的讲述, 我们大体明白了的作用和原理, 但是还有一个问题我们需要研究一下:ConnectionFactory回调方法的调用时机?也就是说什么时候会向rabbitmq broker声明队列, 交换器这些组件呢?
2023-03-02 16:30:54 539
原创 mybatis-plus属性填充
实际开发过程中, 数据库表设计经常需要create和update相关的字段, 如,createTime,,updateTime等, 对于create相关的字段只需要创建的时候赋值即可, 而update相关的字段每次更新都需要重新赋值, 如果直接写在代码里会增加很多无用的代码, 这时候可以通过功能实现。
2022-12-09 11:34:47 233
原创 ServiceLoader源码解析
首先我们看一下示例代码的步骤初始化ServiceLoader (private内部构造器)2. 获取迭代器loader.iterator()LazyIterator上面获取迭代器的源码中提到了lookupIterator, lookupIterator是的实例看到这里, 相必大家已经清楚了ServiceLoader.load()方法的过程, 简单总结一下:那么, 最后还有一个问题, 是在哪里初始化的?...
2022-06-29 17:48:31 515
原创 解密seata全局锁(二)
解密seata全局锁(二)上一篇我们主要讲到了全局锁的生成, 也就是全局锁是什么, 长什么样。下面我们接着分析全局锁在seata中的应用client端client端在提交事务之前要做的就是校验全局锁io.seata.rm.datasource.ConnectionProxy#commit@Overridepublic void commit() throws SQLException { ... doCommit(); ... }io.
2021-09-29 14:30:57 2015
原创 解密seata全局锁(一)
解密seata全局锁从哪开始分析呢?StatementProxyExecuteTemplateexecuteAutoCommitFalse总结从哪开始分析呢?seata的基本原理可以参照2PC, 而本地事务方面的实现是通过代理方式实现扩展, 如: 在执行提交前后生成image等StatementProxy熟悉JDBC的同学应该都知道Statement的作用吧, seata实现Statement功能的代理类就是StatementProxy通过观察StatementProxy里面的方法可以
2021-06-06 09:48:00 4137 12
原创 quartz中的Job
quartz任务详解Job接口JobBuilder和JobDetailJobDetail的其他属性Job接口需要执行的调度任务必须实现Job接口, 重写其execute()方法.以上就是对Job接口, 我们在使用上的理解, Job接口的定义也非常简单只有一个execute()方法void execute(JobExecutionContext context) throws JobExecutionException;JobBuilder和JobDetail还记得我们是怎么定义一个任务
2020-10-09 14:27:15 1106
原创 ThreadLocal源码解析(1)
ThreadLocal源码解析(1)大家想必平时在工作中都或多或少的用到过ThreadLocal, 应用场景也是多种多样, 今天我们来看一下源码大致是怎么实现的从set方法开始, set方法的作用就是设置一个线程变量, 让ThreadLocal管辖public void set(T value) { Thread t = Thread.currentThread(); // 获取当前线程 ThreadLocalMap map = getMap(t); // 通过当前线程获取Thread
2020-09-26 10:36:35 127
原创 彻底搞懂ArrayList的contains方法
ArrayList的contains方法用途用于判断在ArrayList中是否包含目标元素原理调用indexOf(Object o)方法public boolean contains(Object o) { return indexOf(o) >= 0;}indexOf(Object o)方法中调用传入Object对象的equals方法进行比较public int indexOf(Object o) { // 传入的Object是null, 则在集合中
2020-08-23 09:57:17 3794
java面试题汇总 包括 java基础, mysql, redis, springcloud, rabbitmq等
2023-05-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人