Java进阶之路
文章平均质量分 88
非科班大厂码农(同名公众号)
这个作者很懒,什么都没留下…
展开
-
并发编程 | Future是如何优化程序性能
可以看出,FutureTask实现了RunnableFuture接口,而RunnableFuture继承了Runnable和Future,也就是说FutureTask既是Runnable,也是Future。所以 FutureTask 既可以作为 Runnable 被线程执行,又可以作为 Future 得到 Callable 的返回值。@OverrideSystem.out.println("子线程返回值:" + futureTask.get());//输出。原创 2024-08-19 20:34:09 · 702 阅读 · 0 评论 -
并发编程 | CountDownLatch是如何控制线程执行流程
CountDownLatch主要是用于让一个或多个线程等待其他线程完成某些操作后再继续执行。例如,小组早上开会,组长(主线程)只有等所有人(每个人代表一个线程)到达会议室才能开;再如,游乐园里的过山车,一次可以坐10个人,为了节约成本,通常是等够10个人了才开。CountDownLatch的核心思想是“倒计时”:线程在执行之前,需要等到计数器倒数到零。原创 2024-08-19 20:33:11 · 708 阅读 · 0 评论 -
Java基础 | 一文搞懂浅拷贝与深拷贝
通过[3]和[4]的输出可知:源对象和拷贝的对象中的的引用类型变量address地址也一样,说明深拷贝将引用类型的成员变量对象也 拷贝了一份,这是不同于浅拷贝的地方。通过[3]和[4]的输出可知:school和otherSchool中的的引用类型变量address地址一样,说明浅拷贝只是将school中的成员address的引用值(内存地址)复制一份给otherSchool中的address,并不会为引用类型成员变量创建新的对象。引用拷贝不属于对象拷贝,因为它并不会拷贝新的对象,下面介绍的。原创 2024-08-16 16:14:17 · 1095 阅读 · 0 评论 -
并发编程 | 线程池的拒绝策略
自定义拒绝策略可以让你在线程池任务被拒绝时,定义自己的处理逻辑。这样你就可以根据具体的业务需求来决定当线程池无法处理新的任务时应该做什么。要自定义拒绝策略,你需要实现RejectedExecutionHandler接口。这个接口有一个方法rejectedExecution(Runnable r, ThreadPoolExecutor executor),当任务被拒绝时,这个方法会被调用。在rejectedExecution方法中,你可以定义自己的处理逻辑。原创 2024-08-16 16:13:13 · 1061 阅读 · 0 评论 -
并发编程 | 线程池的自动创建
通过程序的运行结果可以看出,调用scheduleWithFixedDelay执行周期任务,这个周期是以上次任务结束的时间为起点开始计时,因此定时的周期不但和设置的参数有关,还和任务的执行时间有关,如本例我设置的周期是3s,任务的执行时间是2s,那么第一次执行任务的时间是16:07:07, 任务执行了2s在16:07:09结束第一次任务,那么在16:07:09的基础上再过3s之后也就是16:07:12 时刻第二次执行任务,以此类推周期执行。注意这个方法只会执行一次任务,后续就不会再执行该任务了。原创 2024-08-15 18:51:36 · 1000 阅读 · 0 评论 -
并发编程 | 线程池的手动创建
corePoolSize:核心线程数,线程池初始化时线程数默认为 0,当有新的任务提交后,会创建新线程执行任务(注意不是在初始化 ThreadPoolExecutor 时立即创建),如果不做特殊设置,此后在程序的运行过程中,线程数通常不会再小于 corePoolSize ,因为它们是核心线程,即便未来可能没有可执行的任务也不会被销毁。我们可以选择使用默认的线程工厂,创建的线程都会在同一个线程组,并拥有一样的优先级,且都不是守护线程,我们也可以选择自己定制线程工厂,为线程指定名字、优先级、守护线程等属性。原创 2024-08-15 17:50:34 · 686 阅读 · 0 评论 -
Java 字符串 HashCode 的奇怪情况
过去 1.5 年以来,我一直在使用 Java 编程。最近,我在尝试对 Java 数据结构进行性能分析。为了亲自体验一下,我决定玩一下我最喜欢的数据结构,即 HashSet。HashSet 提供 O(1) 查找和插入时间。我测量并比较了在 HashSet 中查找具有不同大小的随机字符串所需的时间。以下是我编写的代码片段:-从输出结果我们发现了一个有趣的现象。第一个和最后一个字符串查找所花的时间几乎是中间三个字符串的 3 到 4 倍。即使中间三个字符串的长度更长,我们发现了一个有趣的现象。原创 2024-07-28 09:06:01 · 1171 阅读 · 0 评论 -
Java进阶之路66问 | 谈谈对文本文件和二进制文件的理解
主要依据是文件头部的 Magic Number:许多文件格式在文件的开头几个字节中会包含特定的魔数(Magic Number),用来识别文件的类型,如Word 文档的 Magic Number 是 0xD0CF11E0,编辑器打开一个文件时,首先读取这个Magic Number,如果是0xD0CF11E0,就知道这个文件是word文件,是一个文本文件,就按照文本文件的方式去解释底层的二进制。为什么不以文件的后缀如.txt作为文件区分的依据?所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。原创 2024-07-15 11:43:28 · 571 阅读 · 0 评论 -
Java进阶之路66问 | 对接口签名是怎么理解的?如何防止接口重放攻击?
API重放攻击(Replay Attacks)又称为重播攻击。就是把你的请求原封不动地再发送一次,两次…n次,一般正常的请求都会通过验证进入到正常逻辑中,如果这个正常逻辑是插入数据库操作,那么一旦插入数据库的语句写的不好,就有可能出现多条重复的数据。一旦是比较慢的查询操作,就可能导致数据库堵住等情况,如果是付款接口,或者购买接口就会造成损失。因此需要采用防重放的机制来做请求验证,下面介绍如何对接口做防重放攻击。原创 2024-07-14 10:15:38 · 1518 阅读 · 0 评论 -
Java进阶之路66问 | 什么是幂等性?如何保证接口的冥等性?
幂等性是指无论一个操作执行多少次,最终的结果都是一样的。也就是说,重复执行同一个操作不会改变系统的状态或产生不同的结果。想象你在一栋大楼里等电梯。你按下电梯按钮的5楼按钮键,电梯开始向5楼的位置移动。后面即使你再按几次5楼按钮键,电梯也不会因为你多次按按钮而加速或停止。无论你按多少次按钮,电梯都会正常到5楼。这就是体现了冥等性。原创 2024-07-14 07:58:24 · 894 阅读 · 0 评论 -
Java进阶之路66问 | 谈谈对熔断,限流,降级的理解
假设某个游乐园的过山车每小时只能承载100人,国庆节人流过多,为了保证安全和舒适度,园方实施限流措施,每小时只允许100人排队乘坐。在车辆堵塞时,导航软件可能关闭一些高耗资源的实时交通信息功能,仅显示基本的导航路线,以确保用户仍能获得基本的导航服务。真实的限流器肯定比这里复杂,有不同的限流算法,这里只是为了简单说明限流器的工作原理,没有使用复杂的限流算法。想象你在使用电器时,突然电路过载,保险丝跳闸,自动切断电流,以防止电器损坏或火灾,这就是熔断。限流(Rate Limiting)降级(Fallback)原创 2024-07-13 20:11:20 · 323 阅读 · 0 评论