- 博客(12)
- 问答 (1)
- 收藏
- 关注
原创 ThreadLocal源码分析
通常使用时我们都会new一个ThreadLocal,从set方法开始。如果有值则更新,如果没有那么进入getMap方法可以看到threadLocals默认为null,是懒加载的,它是Thread类中的一个属性走进创建map的方法创建了一个数组,hash位置为threadLocalHashCode首先这里可以看到初始大小为16,且要求必须是2的幂次大小其次查看如何计算哈希值的,可以看到是通过一个AtomicInteger类型的整数值加上哈希增量计算得到的。目的为了良好的哈希减少冲突。
2023-03-31 14:05:47 205
转载 时间轮原理及其在框架中的应用
在本篇文章中,先是举了 3 个例子来论述为什么需要使用时间轮,使用时间轮的优点,在文末处也分别对这 3 个例子在 Dubbo 或 Redisson 中的使用做了介绍。接着通过画图讲解了单层时间轮与多层时间轮机制,让读者对时间轮算法有了一个简单的认识。在第二部分,依次讲解了 Dubbo 时间轮中涉及到的 TimerTask、Timeout、HashedWheelBucket、Worker、HashedWheelTimer,分析了它们的原理与源码实现。
2022-09-26 14:53:20 434
原创 线程池任务队列原理
众所周知,配置线程池时有任务队列这个参数,一般我们选用的就是ArrayBlockingQueue和LinkedBlockingQueue,今天一起来研究下他们的底层吧。
2022-09-06 21:55:44 1203
原创 浅谈Paxos和Raft算法
在分布式系统中,为了消除单点提高系统可用性,通常会使用副本来进行容错,但这会带来另一个问题,即如何保证多个副本之间的一致性。而强一致性就是线性一致性。就是CAP理论的C。所谓的强一致性(线性一致性)并不是指集群中所有节点在任一时刻的状态必须完全一致,而是指一个目标,即让一个分布式系统看起来只有一个数据副本,并且读写操作都是原子的,这样应用层就可以忽略系统底层多个数据副本间的同步问题。
2022-09-06 21:45:40 1514
原创 MyBatis自定义拦截器打印完整SQL和耗时
如果你使用了MyBatis的分页插件,这里会有冲突,自定义的拦截器会在分页插件后加载造成失效。第一期配置好拦截器后,使用@Component和@Bean都尝试过,发现控制台并没有进入拦截器,debug源码后发现它确实注入到Spring中了,那肯定就是数据源的问题。因为数据源配置的是Druid,所以优先调研了后,经过一番实践发现并不能达到理想的效果,因此想到了MyBatis的自定义拦截器。// 获取类型处理器注册器,类型处理器的功能是进行java类型和数据库类型的转换。// 添加自定义属性。...
2022-08-11 14:47:43 2511 1
原创 五种方式实现多线程循环打印问题
三个线程T1、T2、T3轮流打印ABC,打印n次,如ABCABCABCABC…N个线程循环打印1-100…wait-notify循环打印问题可以通过设置目标值,每个线程想打印目标值,如果拿到锁后这次轮到的数不是它想要的就进入waitclass Wait_Notify_ABC { private int num; private static final Object Lock = new Object(); private void print_ABC(int target
2021-12-13 17:20:24 2935 3
原创 synchronized锁升级底层原理
写在前面 今天我们来聊聊 Synchronized 里面的各种锁:偏向锁、轻量级锁、重量级锁,以及三个锁之间是如何进行锁膨胀的。先来一张图来总结 提前了解知识 锁的升级过程 锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(但是锁的升级是单向的,也就是说只...
2021-10-31 13:21:44 590 11
原创 HashMap相关知识总结(HashTable,CurrentHashMap)
Hashmap引入类定义public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, SerializablehashHash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成
2021-10-30 23:29:12 997 14
原创 浅谈fail-fast和fail-safe
1.引入遍历一个集合,我们有三种办法:for循环 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }foreach for (int i : list) { System.out.println(i); }迭代器Iterator while (iterat
2021-10-21 23:08:31 184
原创 Java Swing+Mysql实现汽车租赁系统
汽车租赁系统功能结构图界面设计打包下载git地址:https://github.com/1070124410/Rent_car_control_system.git代码如下:Main入口package Main;import Log.Login;public class Main { public static void main(String[] args) { new Login(); }}extendpackage
2021-01-03 19:52:12 2407 1
空空如也
mysql排它锁问题,行锁问题
2021-09-23
TA创建的收藏夹 TA关注的收藏夹
TA关注的人