
Java 开发日记
文章平均质量分 92
这里是小假的 Java 开发日记
程序员小假
后端初学者、优快云 Java领域新星创作者、阿里云专家博主、华为云云享专家,期待与你的下一次相遇 !
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【Java 开发日记】我们来说一说 ConcurrentHashMap 是如何保证线程安全的?
在jdk1.7中是采用Segment + HashEntry + ReentrantLock的方式进行实现的,而1.8中放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现。JDK1.8的实现降低锁的粒度,JDK1.7版本锁的粒度是基于Segment的,包含多个HashEntry,而JDK1.8锁的粒度就是HashEntry(首节点)原创 2025-08-21 20:45:18 · 1203 阅读 · 44 评论 -
【Java开发日记】我们来说一说如何正确的停掉线程?
中断和关闭线程的方式五花八门,看起来很相似,其实里头大有门道。处理不好,可是会导致程序崩溃的。如果小假的内容对你有帮助,请评论。创作不易,大家的支持就是我坚持下去的动力!原创 2025-08-19 15:24:15 · 2521 阅读 · 70 评论 -
【Java 开发日记】一个不注意就死锁了,该怎么办呢?
当我们在编程世界里遇到问题时,应不局限于当下,可以换个思路,向现实世界要答案,利用现实世界的模型来构思解决方案,这样往往能够让我们的方案更容易理解,也更能够看清楚问题的本质。但是现实世界的模型有些细节往往会被我们忽视。因为在现实世界里,人太智能了,以致有些细节实在是显得太不重要了。在转账的模型中,我们为什么会忽视死锁问题呢?原因主要是在现实世界,我们会交流,并且会很智能地交流。而编程世界里,两个线程是不会智能地交流的。所以在利用现实模型建模的时候,我们还要仔细对比现实世界和编程世界里的各角色之间的差异。原创 2025-08-11 13:02:28 · 7559 阅读 · 82 评论 -
【Java 开发日记】我们来说一说 悲观锁、乐观锁、分布式锁的使用场景和使用技巧
最后来总结一下,如果可以非常熟练的解决这类问题,第一时间肯定想到的是:数据库版本号解决方案或者分布式锁的解决方案;但是如果是一个初学者,一定会第一时间考虑到Java中提供的同步锁或者数据库行锁。如果小假的内容对你有帮助,请评论。创作不易,大家的支持就是我坚持下去的动力!原创 2025-08-07 15:05:12 · 2308 阅读 · 129 评论 -
【Java 开发日记】我们来简单地讲一讲 Git 工作原理
上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。也可以跳过暂存区域直接从仓库取出文件或者直接提交代码。创作不易,大家的支持就是我坚持下去的动力!如果小假的内容对你有帮助,请。原创 2025-08-05 10:59:19 · 1571 阅读 · 16 评论 -
【Java开发日记】我们来说一说如何保证线程安全
同步只是保证共享数据争用时的正确性的手段,如果一个方法本来就不涉及共享数据,那它自然就无需任何同步操作去保证正确性,因此会有一些代码天生就是线程安全的。CAS指令执行时,CAS指令指令时,当且仅当V处的值符合旧预期值A时,处理器用B更新V处的值,否则它就不执行更新,但是无论是否更新了V处的值,都会返回V的旧值,上述的处理过程是一个原子操作。它需要保证对这个对象单独的操作是线程安全的,在调用的时候不需要做额外的保障措施,但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。原创 2025-08-04 10:50:10 · 1694 阅读 · 67 评论 -
【Java开发日记】我们来说说 LockSupport 的 park 和 unpark
LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现。很多锁的类都是基于LockSupport的park和unpark来实现的,所以了解LockSupport类是非常重要的。如果小假的内容对你有帮助,请评论。创作不易,大家的支持就是我坚持下去的动力!原创 2025-08-18 14:58:18 · 20797 阅读 · 80 评论 -
【Java开发日记】我们来说一说 Java 的一致性 Hash 算法
这两个问题其实有很多解决办法,这里使用了一种简单的办法,给每个真实结点后面根据虚拟节点加上后缀再取Hash值,比如”192.168.0.0:111”就把它变成”192.168.0.0:111&&VN0”到”192.168.0.0:111&&VN4”,VN就是Virtual Node的缩写,还原的时候只需要从头截取字符串到”&&”的位置就可以了。通过采取虚拟节点的方法,一个真实结点不再固定在Hash换上的某个点,而是大量地分布在整个Hash环上,这样即使上线、下线服务器,也不会造成整体的负载不均衡。原创 2025-07-14 22:56:49 · 1521 阅读 · 76 评论 -
【Java开发日记】我们来说一说 InputSteam 转 String
创作不易,大家的支持就是我坚持下去的动力!分别按照字符串长度来进行测试。如果小假的内容对你有帮助,请。原创 2025-07-07 14:32:57 · 1897 阅读 · 64 评论 -
【Java开发日记】toString()、String.valueOf、(String)强转,有什么区别?
toString()原创 2025-07-06 10:00:25 · 667 阅读 · 15 评论 -
【Java开发日记】说一说 this 和 super 有什么区别?this 能调用到父类吗?
this和super都是Java中的关键字,都起指代作用,当显示使用它们时,都需要将它们放在方法的首行(否则编译器会报错)。this表示当前对象,super用来指代父类对象,它们有四点不同:指代对象、查找访问、本类属性赋值和的使用不同。如果小假的内容对你有帮助,请评论。创作不易,大家的支持就是我坚持下去的动力!原创 2025-07-06 09:31:17 · 313 阅读 · 38 评论 -
【Java开发日记】我们来讲一讲 ConcurrentHashMap
原来segment里面才是真正的hashtable,即每个segment是一个传统意义上的hashtable,如上图,从两者的结构就可以看出区别,这里就是找出需要的entry在table的哪一个位置,之后得到的entry就是这个链的第一个节点,如果e!这里“按顺序”是很重要的,否则极有可能出现死锁,在ConcurrentHashMap内部,段数组是final的,并且其成员变量实际上也是final的,但是,仅仅是将数组声明为final的并不保证数组成员也是final的,这需要实现上的保证。原创 2025-07-26 21:30:51 · 1212 阅读 · 28 评论 -
【Java开发日记】我们来说一说 Java 反序列化漏洞
所以在日常业务开发的时候,对于 Java 反序列化的安全问题应该具备一定的防范意识,并着重注意传入数据的校验、服务器权限和相关日志的检查, API 权限控制,通过 HTTPS 加密传输数据等方面进行下功夫,以免造成不必要的损失!从上面的案例看,java 的序列化和反序列化,单独使用的并没有啥毛病,核心问题也都不是反序列化,但都是因为反序列化导致了恶意代码被执行了,尤其是两个看似安全的组件,如果在同一系统中交叉使用,也能会带来一定安全问题。那么问题来了,攻击者是如何精心构造反序列化对象并执行恶意代码的呢?原创 2025-07-05 11:25:04 · 2042 阅读 · 14 评论 -
【Java开发日记】我们来详细讲一讲 Java NIO 底层原理
IO多路复用模型的基本原理就是select/epoll系统调用,单个线程不断的轮询select/epoll系统调用所负责的成百上千的socket连接,当某个或者某些socket网络连接有数据到达了,就返回这些可以读写的连接。阻塞IO,指的是需要内核IO操作彻底完成后,才返回到用户空间,执行用户的操作。用户程序进行IO的读写,基本上会用到系统调用read&write,read把数据从内核缓冲区复制到进程缓冲区,write把数据从进程缓冲区复制到内核缓冲区,它们不等价于数据在内核缓冲区和磁盘之间的交换。原创 2025-07-05 11:25:11 · 3843 阅读 · 74 评论 -
【Java开发日记】我们来说说如何使用 Lambda 表达式实现排序功能
return age;@Test// 使用Comparator.comparing的重载方法,传入Comparator.reverseOrder()实现倒序// 验证排序结果在Stream中的操作与直接列表排序类似,可以反转Comparator定义,也可以使用反转。@Test@Test。原创 2025-07-21 16:15:50 · 4277 阅读 · 35 评论 -
【Java开发日记】详细地讲解一下如何保证线程安全性呢?
时分成了三步,第一步是取出当前内存 count 值,这时 count 值时最新的,接下来执行了两步操作,分别是 +1 和重新写回主存。假设有两个线程同时在执行 count++ ,两个内存都执行了第一步,比如当前 count 值为 5 ,它们都读到了,然后两个线程分别执行了 +1 ,并写回主存,这样就丢掉了一次加一的操作。中,var1就是count,而var2第二个值是当前的值,比如想执行的是2+1=3操作,那么第二个参数是2,第三个参数是1。修饰的,代表是java底层的方法,不是通过java实现的。原创 2025-07-17 15:20:56 · 1264 阅读 · 20 评论 -
【Java开发日记】详细地讲解一下 Git 工作原理
上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。也可以跳过暂存区域直接从仓库取出文件或者直接提交代码。创作不易,大家的支持就是我坚持下去的动力!如果小假的内容对你有帮助,请。原创 2025-06-25 09:22:12 · 1159 阅读 · 8 评论 -
【Java开发日记】我们详细地讲解一下 Java 异常及要如何处理
程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?。Java提供了更加优秀的解决办法:异常处理机制。异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。原创 2025-06-24 14:01:35 · 2359 阅读 · 62 评论 -
【Java开发日记】我们详细讲解一下 Java 中 new 一个对象的流程
对象怎么创建,这个太熟悉了,new一下(其实还有很多途径,比如反射、反序列化、clone等,这里拿最简单的new总是习惯于固定语句的执行,却对于背后的实现过程缺乏认知,而理解这个过程对后面晦涩难懂的反射和代理其实会有很大帮助,所以请务必学好这块内容。原创 2025-06-23 09:24:14 · 1649 阅读 · 10 评论 -
【Java开发日记】让我们讲解一下 Map 集合遍历的方式
了解了HashMap 4 种遍历方式:迭代器、for、lambda、stream,以及具体的 7 种遍历方法,综合性能和安全性来看,应该尽量使用迭代器(Iterator)来遍历EntrySet的遍历方式来操作 Map 集合,这样就会既安全又高效了。如果小假的内容对你有帮助,请评论。创作不易,大家的支持就是我坚持下去的动力!原创 2025-06-23 08:53:44 · 1114 阅读 · 13 评论 -
【Java开发日记】我们来说一说 Mybatis 的实现原理
利用 PoolState 加锁,同步执行以下流程判断空闲连接列表是否有空闲连接,如果有则获得这个连接。如果没有空闲连接,则看看活跃的连接是否超过限定值,不超过则通过 JDBC 获取新的连接,再由 PooledConnection 封装,获得这个连接如果活跃连接超过最大限定值,则获得最老的连接(PooledConnection ),看看连接是否超时,如果超时则进行一些统计,把上面一些未提交的事务进行回滚,然后获得底层 JDBC 的连接,再新建 PooledConnection 封装这个底层连接,原创 2025-06-20 08:52:53 · 1364 阅读 · 60 评论 -
【Java开发日记】我们来说一说 Java 序列化的几种方式对比
首先要明白,序列化它是一个过程,什么过程呢?把一个java对象转化成字节序列的过程java对象都知道,那什么是字节序列呢?字节,也就是byte,1byte = 8bit,也就是一个字节等于8位,每一位都是用0或者1来表示,在内存中,数据就是以二进制的形式存储的那序列呢?简单看来说就好比排队,一列一列的,至此,字节序列,是不是就是像字节在排队一样,而字节又是一个个的8bit,理解了吧!原创 2025-06-16 14:44:01 · 1922 阅读 · 27 评论 -
【Java 开发日记】你会不会使用 SpringBoot 整合 Flowable 快速实现工作流呢?
Flowable 是一个使用 Java 编写的轻量级业务流程引擎。Flowable 流程引擎可用于部署 BPMN2.0 流程定义(用于定义流程的行业 XML 标准),创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据,等等。Java 领域另一个流程引擎是 Activiti,不这两个东西只要会使用其中一个,另一个就不在话下。咱就不废话了,上代码吧。原创 2025-06-15 09:49:48 · 4276 阅读 · 76 评论 -
【Java开发日记】我们来说一说 ConcurrentHashMap 中十个提升性能的细节
在看完的哪些操作需要加锁?答:只有写入操作才需要加锁,读取操作不需要加锁的无锁读是如何实现的?答:首先HashEntry中的value和next都是有volatile修饰的,其次在写入操作的时候通过调用UNSAFE库延迟同步了主存,保证了数据的一致性在多线程的场景下调用size()方法获取的大小有什么挑战?是怎么解决的?size()具有全局的语义,如何能保证在不加全局锁的情况下读取到全局状态的值是一个很大的挑战,通过查看两次无锁读中间是否发生了写入操作来决定读取到的size()原创 2025-06-13 10:14:25 · 1136 阅读 · 14 评论 -
【Java开发日记】简单说一说使用 Netty 进行 Socket 编程
Netty是由JBOSS提供的一个java开源框架,现为Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。原创 2025-06-12 10:47:38 · 1965 阅读 · 65 评论 -
【Java开发日记】简单来说一说 @Value 注解
对于从事java开发工作的小伙伴来说,Spring框架肯定再熟悉不过了。Spring给开发者提供了非常丰富的api,满足日常的工作需求。如果想要创建bean实例,可以使用@Service@Component等注解。如果想要依赖注入某个对象,可以使用@Autowired和@Resource注解。如果想要开启事务,可以使用注解。如果想要动态读取配置文件中的某个系统属性,可以使用@Value注解。等等,还有很多。。。重点聊聊@Value。原创 2025-06-09 09:25:49 · 1639 阅读 · 18 评论 -
【Java 开发日记】说一说 Netty 中的心跳机制
使用 TCP 协议层面的 keepalive 机制.在应用层上实现自定义的心跳机制.它不是 TCP 的标准协议, 并且是默认关闭的.TCP keepalive 机制依赖于操作系统的实现, 默认的 keepalive 心跳时间是 两个小时, 并且对 keepalive 的修改需要系统调用(或者修改系统配置), 灵活性不够.TCP keepalive 与 TCP 协议绑定, 因此如果需要更换为 UDP 协议时, keepalive 机制就失效了.readerIdleTimeSeconds, 读超时. 即当在指定原创 2025-06-09 08:53:25 · 908 阅读 · 9 评论 -
【Java开发日记】说一说 SpringBoot 中 CommandLineRunner
平常开发中有可能需要实现在项目启动后执行的功能,SpringBoot提供的一种简单的实现方案就是添加一个model并实现。项目启动之后,要执行的动作是比较的多,那么到底先执行哪个,那么就可以利用这个注解限定优先级。也就是项目一启动之后,就立即需要执行的动作。只需要在项目里面简单的配置,就可以实现这个功能。方法,如果需要按照一定的顺序去执行,那么就需要在实体类上使用一个。Spring Boot应用启动时是可以接受参数的,换句话说也就是。方法的配置项,进行命令行参数的配置,其他IDE工具同理。原创 2025-06-07 10:34:58 · 8065 阅读 · 79 评论 -
【Java开发日记】如何用SpringBoot整合Sharding Sphere实现数据脱敏
在真实业务场景中,数据库中经常需要存储某些客户的关键性敏感信息如:身份证号、银行卡号、姓名、手机号码等,此类信息按照合规要求,通常需要实现加密存储以满足合规要求。原创 2025-06-06 11:09:46 · 6822 阅读 · 13 评论 -
【Java 开发日记】如何用 SpringBoot 接入支付宝
支付宝推出了新的转账接口alipay.fund.trans.uni.transfer(升级后安全性更高,功能更加强大) ,老转账接口alipay.fund.trans.toaccount.transfer将不再维护,新老接口的一个区别就是新接口采用的证书验签方式。使用新接口要将sdk版本升级到最新版本,当前使用的最新版本是4.10.97。创作不易,大家的支持就是我坚持下去的动力!如果小假的内容对你有帮助,请。Tips:转账用到的类。原创 2025-06-04 14:21:04 · 5843 阅读 · 75 评论 -
【Java开发日记】基于 Spring Cloud 的微服务架构分析
Spring Cloud Config:配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git 以及 Subversion。Spring Cloud Bus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与 Spring Cloud Config 联合实现热部署。Eureka:云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。原创 2025-06-02 19:41:04 · 8509 阅读 · 34 评论 -
【Java开发日记】说一说序列化与反序列化中存在的问题
Override;// ... 其他省略 ...原创 2025-05-27 09:55:38 · 6789 阅读 · 96 评论 -
【Java开发日记】带你说说 SpringMVC 的处理流程
这里就涉及到设计模式中的责任链设计模式,HandlerExecutionChain 将 HandlerInterceptor 与 Handler 串成一个执行链的形式,首先请求会被第一个 HandlerInterceptor 拦截,如果返回 false,那么直接短路请求,如果返回 true,那么再交给第二个 HandlerInterceptor 处理,直到所有的 HandlerInterceptor 都检查通过,请求才到达 Handler(Controller),交由 Handler 正式的处理请求。原创 2025-05-26 10:24:48 · 7371 阅读 · 89 评论 -
【Java开发日记】你会不会5种牛犇的yml文件读取方式?
这里介绍了5种读取yml配置文件的方式,前3种依赖于Spring环境,而SnakeYml和Jackson则可以脱离环境独立使用,可以说它们是对@Value和注解使用的补充。这几种方法的使用场景不同,也各有各的有优点,各自具备一些特殊的用法,而在工作中更多情况下,要根据具体的用途进行一种方案的选取或多种的搭配使用。如果小假的内容对你有帮助,请评论。创作不易,大家的支持就是我坚持下去的动力!原创 2025-05-15 09:49:37 · 6308 阅读 · 100 评论 -
【Java开发日记】简单说说并发编程有哪些业务场景
当然,这个例子中没有演示MdcUtil类的add方法具体调的地方,可以在filter中执行接口方法之前,生成traceId,调用MdcUtil类的add方法添加到MDC中,然后在同一个请求的其他地方就能通过MdcUtil类的get方法获取到该traceId。根据以往积累的经验,直接看了kafka的topic的数据,果然上面消息有积压,但这次每个partition都积压了十几万的消息没有消费,比以往加压的消息数量增加了几百倍。在高并发的场景中,消息积压问题,可以说如影随形,真的没办法从根本上解决。原创 2025-05-26 09:44:54 · 5623 阅读 · 86 评论 -
【Java开发日记】如何使用Java开发在线生成 pdf 文档
在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票、订单的库存打印单、各种电子签署合同等等,以方便用户查看、打印或者下载。例如下图的电子发票!熟悉这块业务的童鞋,一定特别清楚,目前最常用的解决方案是:把相关的数据信息,通过一些技术手段生成对应的 PDF 文件,然后返回给用户,以便预览、下载或者打印。不太熟悉这项技术的童鞋,也不用着急,一起来详细了解一下在线生成 PDF 文件的技术实现手段!原创 2025-05-12 09:24:35 · 8353 阅读 · 125 评论 -
【Java开发日记】为什么不推荐使用 BigDecimal 的 equals 方法做等值比较 ?
BigDecimal 是 java.math 包中提供的一种可以用来进行精确运算的类型。所以,在支付、电商等业务中,BigDecimal 的使用非常频繁。而且其内部自带了很多方法,如加,减,乘,除等运算方法都是可以直接调用的。除了需要用 BigDecimal 表示数字和进行数字运算以外,代码中还经常需要对于数字进行相等判断。说到等值比较,先看看《阿里巴巴Java开发手册》中的要求👇:那么为什么会有这样的要求呢🤔~ 其中的奥秘是什么呢🤔~原创 2025-05-06 10:45:57 · 6346 阅读 · 105 评论 -
【Java开发日记】JVM调优之垃圾定位、垃圾回收算法、垃圾处理器对比
垃圾,主要是指堆上的对象,那么如何确定这些对象是可以被回收的呢?大概思路就是,如果一个对象永远不可能被访问到,那么就是垃圾,可以被回收了如何确定对象永远不会被使用呢?如果小假的内容对你有帮助,请评论。创作不易,大家的支持就是我坚持下去的动力!原创 2025-05-05 15:08:10 · 8244 阅读 · 103 评论 -
【Java开发日记】OpenFeign 的 9 个坑
对于单个接口怎么配置超时时间,这里给出一个方案。使用@Bean@Bean为了使用ribbon负载均衡,上面加了如果使用,就会使用中配置的时间。原创 2025-04-28 10:41:31 · 7514 阅读 · 101 评论 -
【Java开发日记】一篇文章让你学会SpringCloud-微服务架构
架构的发展历程是从单体式架构,到分布式架构,到SOA架构,再到微服务架构。图1:架构演进单体架构:未做任何拆分的Java Web程序图2:单体架构示意图分布式架构:按照业务垂直划分,每个业务都是单体架构,通过API互相调用。图3:分布式架构示意图SOA架构:SOA是一种面向服务的架构。其应用程序的不同组件通过网络上的通信协议向其它组件提供服务或消费服务,所以也是分布式架构的一种。图4:SOA架构示意图。原创 2025-04-24 09:16:52 · 6866 阅读 · 102 评论