- 博客(187)
- 问答 (2)
- 收藏
- 关注
原创 JackJson多态
@JsonTypeInfo 处理多态、序列化对象类型_赵丙双的博客-CSDN博客JsonTypeInfo实现jackson的多态解析_MonkeyKing_sunyuhua的博客-CSDN博客Java Jackson @JsonTypeInfo 多态类型处理 - 简书
2023-09-21 19:52:05
265
原创 Redis中注意的问题
因此,在高并发场景下,为了避免出现数据不一致的问题,需要采用加锁机制来保证同一时间只有一个客户端能够对指定 key 进行操作,从而避免竞争条件。2.1 早期我在我们内部做了个测试,redis是集群服务,incr压测十万次最后的结果不是10万总是会差几个。在高并发场景下,多个客户端同时向 Redis 发送 INCR 命令时,可能会出现竞争条件(Race Condition),导致数据不一致的问题。因此,在这种情况下,调用 INCR 命令 1 万次得到的结果不一定是 1 万。
2023-04-26 15:13:28
543
1
原创 设计模式 java
JAVA设计模式--组合模式-菜鸟笔记设计模式之什么是状态模式 - 知乎秒懂设计模式之状态模式(State Pattern) - 知乎重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」
2023-04-11 11:58:34
77
原创 Mybatis高阶使用
Mybatis——拦截器Interceptor_mybatis interceptor_七海健人的博客-CSDN博客mybatis拦截器使用及原理_metaobject.forobject_huang_ma的博客-CSDN博客https://www.cnblogs.com/javaDeveloper/p/13151682.html
2023-04-06 11:29:11
295
原创 Spring高阶使用总结
@ConfigurationProperties使用详解_sunnyday0426的博客-CSDN博客实用:Spring的多租户数据源管理 AbstractRoutingDataSource! - 知乎
2023-04-05 10:41:19
354
原创 Lottery项目学习
假设有两个数,A和B(A>0,B>0)。B为2^n,期中n>=0,A>=0。则:(原来B得为2^n)要求A * B的话,则可使用> n。要求A % B的话,则可使用&操作符,A&(B-1)。
2023-03-30 18:42:33
392
原创 DDD学习
还在搞MVC?DDD才是yyds!有了MVC,为什么还要DDD?_ddd架构和mvc架构区别_倾听铃的声的博客-CSDN博客https://gitcode.net/KnowledgePlanet/Lottery/-/wikis/%E7%AC%AC-2-%E9%83%A8%E5%88%86-%E9%A2%86%E5%9F%9F%E5%BC%80%E5%8F%91/%E7%AC%AC02%E8%8A%82%EF%BC%9A%E6%90%AD%E5%BB%BADDD%E5%9B%9B%E5%B1%82%E6%9E
2023-03-30 11:13:27
74
原创 匿名内部类访问成员变量和局部变量的优化
准备工具: jad, jdk测试代码:public class HigherUser { public interface TeacherService1 { void queryUserInfo(); } String str="ad"; int a=2; private String name; public static void main(String[] args) { HigherUser higher
2022-04-20 11:00:12
405
原创 SpringBoot自动装配原理详细讲解(清楚 明白)
1.启动类上因为加上了 @EnableEurekaServer这个注解 才可以实现自动装配@SpringBootApplication@EnableEurekaServerpublic class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class); }}2.自动装配的核心方法loadSpri.
2022-03-26 12:18:12
1187
1
原创 protected,private final 方法能否被代理
1.JDK动态代理private,protected方法肯定不能被代理,因为接口就不支持private protected方法2.CGLIB动态代理private方法肯定是不能被代理的,因为子类和其它类都不能方法一个类的私有方法protected方法到是可以被代理,但是CGLIB是基于继承关系来实现的,生成的代理类中对于protected的代理方法,也是protected的,访问范围受限制protected 方法的作用域范围:1>同package下可以随意访问2> 不
2022-03-14 10:51:55
3690
2
原创 ReentrantLock源码分析
1.代码优化的设计非公平模式下:非公平锁的加锁流程,线程在进入同步队列等待之前有两次抢占锁的机会:第一次是非重入式的获取锁,只有在当前锁未被任何线程占有(包括自身)时才能成功; 第二次是在进入同步队列前,包含所有情况的获取锁的方式。只有这两次获取锁都失败后,线程才会构造结点并加入同步队列等待。有的博客说写两次获得锁的逻辑虽然减少了代码的简洁,但这种对非重入且虽然队列中有线程在等待获取锁,但是在等待的线程在获取锁之前,这个新来的线程提前去占据了锁,提高了性能,我觉得应该是新的线程避免执行
2022-03-06 17:20:21
265
转载 JDK动态代理源码
JDK动态代理[4]----ProxyGenerator生成代理类的字节码文件解析 - 差不多先生的个人空间 - OSCHINA - 中文开源技术交流社区通过前面几篇的分析,我们知道代理类是通过Proxy类的ProxyClassFactory工厂生成的,这个工厂类会去调用ProxyGenerator类的generateProxyClass()方法来生成代理类的字节码。ProxyGenerator这个类存放在sun.misc包下...https://my.oschina.net/xiaominmin/blog
2022-03-03 10:23:01
137
原创 一个字符究竟占多少字节辨析
字符和字节的换算,则与编码方式有关,不同的字符所占的字节是不同的。: ASCII码: 一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。 UTF-8编码: 一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。 Unicode编码: 一个英文等于两个字节,一个中文(含繁体)等于两个字节。 UTF-16编
2022-02-27 11:58:46
3485
原创 MySql字段类型的选择
1.主键设计主键不要与业务逻辑有所关联,最好是毫无意义的一串独立不重复的数字,且自增,最好设计为Long类型,对应MySQL的bigintbigint详解:MySQL_bigint(20) 是什么意思? - 根号829 - 博客园2.关于外键 尽量不要建立外键,保证每个表的独立性。如果非得保持一定的关系,最好是通过id进行关联,我们使用业务进行管理,否则每次删除或更新都会关联查询,性能差,可以把这个逻辑放在业务层里,避免额外的查询3.动静分离 最好做好静态表和动态...
2022-02-27 11:46:39
2803
原创 Dubbo IOC AOP的实现
Dubbo在SPI机制中实现了IOC功能, Dubbo IOC的主干业务逻辑就是在injectExtension方法中,下面是对Dubbo IOC业务逻辑的梳理:1. Dubbo的IOC是怎么获取对象的: 当通过SPI机获取对象时,如果发现该类有set开头的方法,就会调用injectExtension方法,为其注入属性值, 被注入属性的对象有两类: 1>该类/接口上有@SPI注解,则会通过SpiExtensionFactory来获取对象,并进行注入,具体使用方式...
2022-02-22 19:27:25
582
原创 redis的多路复用和事件处理器使用的是同一个线程吗?
在学习IO模型的时候,不断纠结的地方是select/poll/epoll都是阻塞的,而redis又是单进程的,那么它是如何做到一边监听socket,一遍处理事件的,这一点问题网上的答案写的真是五花八门,难道真的是一个线程负责调用IO多路复用函数,然后将监听到的事件放在队列中,然后事件处理器去调用吗?先上结论: IO多路复用和处理事件确实是一个线程完成的,当redis没有关闭的时候外层一直在循环,循环的过程中监听到事件就进行处理,在没有事件时就会阻塞在wait, 当请求到来后就会唤醒线...
2022-01-27 20:13:01
1740
原创 索引的选择从AVL树平衡二叉树到B+树
前置知识:1>索引是存在于索引文件中,是一种数据结构,存在于磁盘中的。因为索引通常是很大的,因此无法一次将全部索引加载到内存当中,因此每次只能从磁盘中读取一个磁盘页的数据到内存中。而这个磁盘的读取的速度较内存中的读取速度而言是差了好几个级别。2>传统用来搜索的平衡二叉树有很多,如 AVL 树,红黑树等。这些树在一般情况下查询性能非常好,但当数据非常大的时候它们就无能为力了。原因当数据量非常大时,内存不够用,大部分数据只能存放在磁盘上,只有需要的数据才加载到内存中。一般而言内存访问的时间约
2022-01-24 10:36:08
300
原创 分别用一二三级缓存解决循环依赖的方案
一. 一级缓存1.不考虑aop 使用—级缓存解决循环依赖1>创建A对象,放到缓存中,这时候为A对象注入属性 2>创建B放到缓存,从缓存中获得A对象,将B对象返回给A对象(这时候如果不考虑aop 一级缓存就可以解决循环依赖的问题了)2.考虑aop时,一级缓存无法解决循环依赖的问题 因为初始化操作必须放在aop代理之前, 否则导致初始化的时候无法改变代理对象的属性值(具体见动态代理对象属性注入的文章动态代理对象的属性注入_zyz的博客-CSD...
2022-01-19 20:29:36
1662
1
转载 CMS收集器和G1收集器的区别
区别一: 使用范围不一样CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用区别二: STW的时间CMS收集器以最小的停顿时间为目标的收集器。G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)区别三: 垃圾碎片CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片G1收集器使用的是“标记-整理”算法,进行了空间整合,没有内存空间碎片。区别四: 垃圾回收..
2022-01-19 16:53:01
12238
原创 minor gc , major gc ,full gc, mixed gc的理解总结
对于这块知识,看深入理解Java虚拟机和相关博客时总觉得迷迷糊糊的,对于什么时候触发哪种gc,哪种垃圾回收器对应哪种gc机制还是一知半解,下面总梳理下自己的理解,如果有误,欢迎指正:1. minor gc这点没有什么好说的, 就是yong gen空间不足时触发minor gc,可使用的垃圾回收器有 Serial , ParNew, Parallel Scavenge,G1等收集器2.major gc/ old gcmajor gc一般指的就是对于old gen的垃圾回收,最困惑的地方就
2022-01-19 12:47:45
987
转载 新生代对象进入老年代的时机:
对象优先在Eden区分配对象优先在Eden区分配,当Eden去没有足够的空间时,JVM将发起一次Minor GC,如果此时to区仍然存不下Eden和Survivor区中存活的对象,则将存活的对象存放到老年代中。大对象直接进入老年代所谓的大对象是指,需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组(笔者列出的例子中的byte[]数组就是典型的大对象)。 大对象对虚拟机的内存分配来说就是一个坏消息(替Java虚拟机抱怨一句,比遇到一个大对象更加坏的消息就是遇到一群“朝生夕灭
2022-01-19 12:29:50
377
转载 JAVA之private修饰成员方法默认是final型的?
Java之private修饰成员方法默认是final型的? 用fianl声明的成员方法是最终方法,最终方法不能被子类覆盖(重写) 从表面上看这个命题是错误的,这种说法完全没有根据,属于误人子弟 private和final没关系,是两回事 拿属性来说可能更容易理解一些,虽然private不能访问,但通过反射修改访问权限还是可以访问修改的,但加了final,即使可以访问了也修改不了值,这就是区别 自己用反射打印一下结果就知道了,或者用javap反编译看一下伪代码JAV...
2022-01-16 11:41:04
251
1
原创 ThreadLocalMap中为什么valu是强引用,不是弱引用
这里假设value和threadlocal都是弱引用,假如threadlocal除了 被Entry这个弱引用所引用之外,还被强引用,则这时value的值还没被获取,也就是value 这时只被Entry这个弱引用所引用,这时候发生gc,threadlocal不会被回收,value回被回收 ,导致通过threadlocal获得value值时获得为Null。...
2022-01-15 20:09:38
3342
10
原创 动态代理对象的属性注入
下面会分别对Jdk和Cglib两种类型的动态代理的对象进行分析1.Cglib1> 直接通过反射创建代理对象 User user=new User("zyz",123); Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(user.getClass()); enhancer.setInterfaces(user.getClass().getInterfaces());
2022-01-13 22:25:34
1284
原创 zookeeper重难知识点汇总
一.一致性协议1.ZAB协议:实例详解ZooKeeper ZAB协议、分布式锁与领导选举 - 架构 - dbaplus社群:围绕Data、Blockchain、AiOps的企业级专业社群。技术大咖、原创干货,每天精品原创文章推送,每周线上技术分享,每月线下技术沙龙。读完本文,ZooKeeper不再难懂!https://dbaplus.cn/news-141-1875-1.html2.Paxos分布式系列文章——Paxos算法原理与推导 - lzslbd - 博客园https://www.cn
2022-01-05 14:11:27
990
转载 为什么Mysql有了缓存,还要使用Redis作为缓存
MySQL Query Cache优缺点 优点: Query Cache的查询,发生在MySQL接收到客户端的查询请求、查询权限验证之后和查询SQL解析之前。也就是说,当MySQL接收到客户端的查询SQL之后,仅仅只需要对其进行相应的权限验证之后,就会通过Query Cache来查找结果,甚至都不需要经过Optimizer模块进行执行计划的分析优化,更不需要发生任何存储引擎的交互。由于Query Cache是基于内存的,直接从内存中返回相应的查询结果,因此减少了大量的磁盘I/...
2021-12-28 10:19:08
1154
1
原创 共享锁和排它锁的理解
基本的封锁类型有两种: 排它锁(X锁)和共享锁(S锁).所谓X锁,是事务T对数据A加上X锁时,只允许事务T读取和修改数据A,...所谓S锁,是事务T对数据A加上S锁时,其他事务只能再对数据A加S锁,而不能加X锁,直到T释放A上的S锁 若事务T对数据对象A加了S锁,则T就可以对A进行读取,但不能进行更新(S锁因此又称为读锁),在T释放A上的S锁以前,其他事务可以再对A加S锁,但不能加X锁,从而可以读取A,但不能更新A. 若事务T1对数据A加了排他锁,但是事务T2只想读数据A而不修...
2021-12-27 10:20:47
667
原创 对事务一致性的理解
teacher 表:事务1:事务2:1>如事务1和事务2在对方没有提交或回滚前都开启了2> 在一个事务1中对某行数据进行修改(update teacher set core=666 where core= -222;)3>在另一个事务2中提前执行了update teacher set core=888 where core=-222;4>如果事务1先执行这条update语句,在事务1没有提交时事务2 也执行了updat...
2021-12-23 17:27:14
915
原创 引用队列使用时遇到的一个大坑
当我使用弱引用时希望通过引用队列来回收弱引用对象发现引用队列怎么都获取不到回收的弱引用对象,如下:/** * @author: @zyz */public class ReferenceTest6 { private static final int _4MB = 4 * 1024 * 1024; public static void main(String[] args) throws InterruptedException { // 引用队列 ReferenceQue..
2021-12-16 21:01:54
109
原创 Spring源码分析 ---- BeanFactory接口的设计分析
在看spring这块源码的时候,苦苦思索却想不明白spring为何要把这块接口设计的这么复杂,下面是自己的一些思考,如果有误欢迎指正:一.接口的设计IOC是spring的核心功能,BeanFactory接口在设计的时候遵循了单一指针原则,接口按照功能进行划分,每一层实现特定的功能,下面介绍了每一层所负责的功能: (图片引自小博哥)1.BeanFactory:该层是最顶层的接口,仅仅提供了一些getBean的方法2.AbstractBean...
2021-12-13 21:09:33
588
原创 AQS源码学习
Java并发之AQS详解 - waterystone - 博客园java、多线程、并发、AbstractQueuedSynchronized、AQS、Lock、Mutex、ReentrantLock、Semaphore、CountDownLatch、线程同步https://www.cnblogs.com/waterystone/p/4920797.html学这篇文章中存在几个疑惑的地方做以记录:1.head节点的线程是当前持有资源可运行的线程,第 二个节点在parkAndCheckInterrupt
2021-12-13 11:19:50
268
原创 单一职责原则和接口隔离原则区别的理解
网上对于两者的区别众说纷纭,总是一套理论下来跟没有说一样,下面说说自己的理解:单一职责原则:是将某一职责的方法全放在一个接口中,这时候就会出现实现该接口的类必须实现该接口中自己用不到的方法(违背接口隔离原则)接口隔离原则:是为了将胖接口分成粒度更细的接口,每个类仅仅实现自己所需的接口即可,这就导致同一职责的胖接口可能会被划分为粒度更细的接口(所以在设计接口时单一职责原则和接口隔离原则可能会无法两全)设计模式六大原则(4):接口隔离原则_三级小野怪的专栏-CSDN博客_接口隔离原则定.
2021-12-10 22:07:55
784
原创 synchronized的底层实现原理
1.JDK1.6对synchronized做的优化:传统的锁(也就是下文要说的重量级锁)依赖于系统的同步函数,在linux上使用mutex互斥锁,这些同步函数都涉及到用户态和内核态的切换、进程的上下文切换,成本较高。对于加了synchronized关键字但运行时并没有多线程竞争,或两个线程接近于交替执行的情况,使用传统锁机制无疑效率是会比较低的。Java SE1.6为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和“轻量级锁”,所以在Java SE1.6里锁一共有四种状态,无锁状态,偏向..
2021-12-09 10:45:43
549
原创 HashMap源码分析
JDK1.7和jdk1.8对于HashMap实现的异同总结:具体可以看这篇文章,但这篇文章几个地方存在歧义,下面做以补充:(1)美团面试题:Hashmap的结构,1.7和1.8有哪些区别,史上最深入的分析_王伟的博客-CSDN博客_hashmap1.7和1.8的区别(一) 真实面试题之:Hashmap的结构,1.7和1.8有哪些区别不同点:(1)JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头插法就是能够..
2021-12-07 10:28:34
745
原创 HashMap源码学习
史上最详细的 JDK 1.8 HashMap 源码解析_程序员囧辉-CSDN博客_hashmap1.8可能是史上最详细的 HashMap 源码解析。https://blog.csdn.net/v123411739/article/details/78996181疫苗:Java HashMap的死循环 | 酷 壳 - CoolShellhttps://coolshell.cn/articles/9606.html什么?HashMap竟然也有懒加载?_小饭饭带你玩waigua的博客-CSDN博客不花时间的导读:
2021-12-03 20:52:42
93
原创 ArrayList源码分析
通过源码一步一步分析ArrayList 扩容机制_一眼过云烟-CSDN博客一 先从 ArrayList 的构造函数说起ArrayList有三种方式来初始化,构造方法源码如下: /** * 默认初始容量大小 */ private static final int DEFAULT_CAPACITY = 10; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEME...https://blog.csdn.net/qq_38621334/article/
2021-12-02 12:04:06
231
转载 JDBC是如何打破双亲委派模式的
yJDBC是如何打破双亲委派模式的 - 掘金为什么JDBC需要打破双亲委派机制 JDBC的DriverManager与SPI机制 类加载的机制以及双亲委派机制的介绍可以参考 JVM类加载机制 在JDBC 4.0之后,我们不再需要调用Class.https://juejin.cn/post/7007292903361871903为什么JDBC需要打破双亲委派机制 JDBC的DriverManager与SPI机制 类加载的机制以及双亲委派机制的介绍可以参考 JVM类加载机制 在JDBC 4.0之后,我们不再需要
2021-11-26 20:55:51
241
空空如也
请教一些数据结构的问题~~~
2017-09-13
请教数据结构算法的一点问题~~
2017-09-13
TA创建的收藏夹 TA关注的收藏夹
TA关注的人