博客园 - Silentdoer
uuid:24b78886-0ed1-41c2-8670-e3f31dcf42c4;id=138237
2024-01-11T07:27:07Z
Silentdoer
https://www.cnblogs.com/silentdoer/
feed.cnblogs.com
https://www.cnblogs.com/silentdoer/p/17943201
似乎有点理解指令集和架构的区别了 - Silentdoer
架构就是造房子的图纸,而指令集就是造房子的材料【玩过俄罗斯方块可能就比较好理解什么是指令集了】 比如指令集里只有:L型的砖,I型的砖,田字形的砖等; 而架构就是基于上面的砖(指令集)设计好的房子的造法,即最底层是用什么砖,往上是用什么砖等等; 不过还是有疑问,如果真的是这么理解的话,那图纸一模一样,
2024-01-03T06:54:00Z
2024-01-03T06:54:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】架构就是造房子的图纸,而指令集就是造房子的材料【玩过俄罗斯方块可能就比较好理解什么是指令集了】 比如指令集里只有:L型的砖,I型的砖,田字形的砖等; 而架构就是基于上面的砖(指令集)设计好的房子的造法,即最底层是用什么砖,往上是用什么砖等等; 不过还是有疑问,如果真的是这么理解的话,那图纸一模一样, <a href="https://www.cnblogs.com/silentdoer/p/17943201" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17940190
dev、st、uat分支存在多个特性一起开发测试时的冲突解决方式 - Silentdoer
1.最大的问题是f1和f2会同时开发,但是f1和f2却可能分两次上线,所以开发自测环境(dev)可能同时存在f1和f2的代码; 因此做这样的规定就能避免公共开发自测环境(dev)的代码流入不上线的内容到生产里; dev -> kf_dev // ERROR,kf_dev是开发自己的分支; uat -
2024-01-02T03:46:00Z
2024-01-02T03:46:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】1.最大的问题是f1和f2会同时开发,但是f1和f2却可能分两次上线,所以开发自测环境(dev)可能同时存在f1和f2的代码; 因此做这样的规定就能避免公共开发自测环境(dev)的代码流入不上线的内容到生产里; dev -> kf_dev // ERROR,kf_dev是开发自己的分支; uat - <a href="https://www.cnblogs.com/silentdoer/p/17940190" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17918674.html
观察者模式和发布订阅模式的区别 - Silentdoer
观察者模式只有两个对象,一个是观察者(Listener)和被观察者; 观察者通过实现被被观察者提供的接口,add到被观察者的Listener列表里; 当被观察者内部产生相关事件时,通过其Listener列表来通知观察者; 而发布定义模式则多了一个中介(Broker,比如Kafka),即分为了生产者、
2023-12-21T03:52:00Z
2023-12-21T03:52:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】观察者模式只有两个对象,一个是观察者(Listener)和被观察者; 观察者通过实现被被观察者提供的接口,add到被观察者的Listener列表里; 当被观察者内部产生相关事件时,通过其Listener列表来通知观察者; 而发布定义模式则多了一个中介(Broker,比如Kafka),即分为了生产者、 <a href="https://www.cnblogs.com/silentdoer/p/17918674.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17916492.html
having在SQL里的作用以及和where的区别 - Silentdoer
1.where和having都是过滤数据的作用,且都是根据某个“字段”来过滤数据,区别在于: where是根据from的表里的行数据来过滤,比如where aa > 1表示查出from的表里aa字段>1的所有行; where可以不和group by一起用; 而having是对已经分组(聚合)的组进行
2023-12-20T06:42:00Z
2023-12-20T06:42:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】1.where和having都是过滤数据的作用,且都是根据某个“字段”来过滤数据,区别在于: where是根据from的表里的行数据来过滤,比如where aa > 1表示查出from的表里aa字段>1的所有行; where可以不和group by一起用; 而having是对已经分组(聚合)的组进行 <a href="https://www.cnblogs.com/silentdoer/p/17916492.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17914444.html
代理模式理解 - Silentdoer
代理模式其实称为网关模式就很好理解,即代理就是那个网关,它只是会额外的做一些操作(比如日志记录,拦截等),然后原封不动的将参赛调用被代理对象, 然后再将被代理对象(各方法)执行后拿到的结果返回给调用放; 即中间多了一个代理层(网关); 网关需要配置被代理服务的地址,同样的代理对象需要配置被代理对象;
2023-12-19T10:49:00Z
2023-12-19T10:49:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】代理模式其实称为网关模式就很好理解,即代理就是那个网关,它只是会额外的做一些操作(比如日志记录,拦截等),然后原封不动的将参赛调用被代理对象, 然后再将被代理对象(各方法)执行后拿到的结果返回给调用放; 即中间多了一个代理层(网关); 网关需要配置被代理服务的地址,同样的代理对象需要配置被代理对象; <a href="https://www.cnblogs.com/silentdoer/p/17914444.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17914202.html
编程设计原则 - Silentdoer
java设计原则,主要是这几点: 1.单一职责,即一个方法只做一个功能,一个类尽量只负责一类功能; 2.接口隔离原则,即不是共存的功能应该用多个接口声明(比如open和close可以是放一个接口,因为不能说使用了资源不释放;但是吃饭和跑步是可以分来两个接口的) 3.依赖倒置原则,其实就是要求类不应该
2023-12-19T09:04:00Z
2023-12-19T09:04:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】java设计原则,主要是这几点: 1.单一职责,即一个方法只做一个功能,一个类尽量只负责一类功能; 2.接口隔离原则,即不是共存的功能应该用多个接口声明(比如open和close可以是放一个接口,因为不能说使用了资源不释放;但是吃饭和跑步是可以分来两个接口的) 3.依赖倒置原则,其实就是要求类不应该 <a href="https://www.cnblogs.com/silentdoer/p/17914202.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17792948.html
select for update在springboot里实现分布式锁 - Silentdoer
// mapper,注意,这里的参数最好就是主键或者唯一键,否则产生的是表锁,script可以省略 @Select("<script> select* from foo where id = #{id} for update</script>") Foo selectForUpdateById(@P
2023-12-12T09:47:00Z
2023-12-12T09:47:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】// mapper,注意,这里的参数最好就是主键或者唯一键,否则产生的是表锁,script可以省略 @Select("<script> select* from foo where id = #{id} for update</script>") Foo selectForUpdateById(@P <a href="https://www.cnblogs.com/silentdoer/p/17792948.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17893023.html
接口实现多态,本质上是接口方法实现的多态 - Silentdoer
比如接口: interface Fly { void name(); void kkk(); } Fly f = subObj; // 其实多态发生在这里,f会找到其真实类型,即subObj的真实类型 // 然后去找真实类型里是否实现了void name()这个方法,没有找到则再找subObject
2023-12-10T10:18:00Z
2023-12-10T10:18:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】比如接口: interface Fly { void name(); void kkk(); } Fly f = subObj; // 其实多态发生在这里,f会找到其真实类型,即subObj的真实类型 // 然后去找真实类型里是否实现了void name()这个方法,没有找到则再找subObject <a href="https://www.cnblogs.com/silentdoer/p/17893023.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17880715.html
类型的子类其实应该叫子集更合适 - Silentdoer
而子集是针对类型而言的,比如A extends B,那么A是B的子集; 注意,这里是A类型是B类型的子集,而不是A类型对象是B类型对象的子集; 而A类型是B类型的子集,表示 B类型 比 A类型 能承载的对象 更广; 所以int是long类型的子集,因为long类型 比 int类型 能承载的对象 更广
2023-12-06T14:46:00Z
2023-12-06T14:46:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】而子集是针对类型而言的,比如A extends B,那么A是B的子集; 注意,这里是A类型是B类型的子集,而不是A类型对象是B类型对象的子集; 而A类型是B类型的子集,表示 B类型 比 A类型 能承载的对象 更广; 所以int是long类型的子集,因为long类型 比 int类型 能承载的对象 更广 <a href="https://www.cnblogs.com/silentdoer/p/17880715.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17797794.html
RedisTemplate使用 - Silentdoer
RedisTemplate底层要用jedis,另外的lettuce存在bug; 而且jedis支持只配置集群的部分节点(可以不包含master节点)自动同步下载其他节点; 然后就是redisTemplate的increment经过测试是没有问题的并发执行确实是原子的; 而且redis的key过期后是
2023-12-06T01:26:00Z
2023-12-06T01:26:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】RedisTemplate底层要用jedis,另外的lettuce存在bug; 而且jedis支持只配置集群的部分节点(可以不包含master节点)自动同步下载其他节点; 然后就是redisTemplate的increment经过测试是没有问题的并发执行确实是原子的; 而且redis的key过期后是 <a href="https://www.cnblogs.com/silentdoer/p/17797794.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17333253.html
分片/分区和副本 - Silentdoer
slot也有分区的意思;(redis里) 这是两个很重要的概念,新的存储中间件如ES、Kafka、MongoDB等都用了这两种技术; 分片/分区是实现数据分流的重要手段,也是实现动态扩容的重要手段; 而副本则是冗余数据实现高可用 而数据具体是放哪个分片则是通过路由来实现,kafka它要求所有的数据都
2023-12-04T02:58:00Z
2023-12-04T02:58:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】slot也有分区的意思;(redis里) 这是两个很重要的概念,新的存储中间件如ES、Kafka、MongoDB等都用了这两种技术; 分片/分区是实现数据分流的重要手段,也是实现动态扩容的重要手段; 而副本则是冗余数据实现高可用 而数据具体是放哪个分片则是通过路由来实现,kafka它要求所有的数据都 <a href="https://www.cnblogs.com/silentdoer/p/17333253.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17871379.html
试着设计一个自己的语言 - Silentdoer
1.最重要的一点是一致性(初版本先用自然语言的形式设计语法) 2.优雅(先实现一版,后续改进) 3.静态类型 4.自然语言的语法,且容易转换为中文表述 5.可扩展,即初期肯定不会实现很多功能,后面要加的功能不能加上来和现有的设计不一致 大概设想: 注释和java的保持一致,但是支持 /* * 这种方
2023-12-02T03:14:00Z
2023-12-02T03:14:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】1.最重要的一点是一致性(初版本先用自然语言的形式设计语法) 2.优雅(先实现一版,后续改进) 3.静态类型 4.自然语言的语法,且容易转换为中文表述 5.可扩展,即初期肯定不会实现很多功能,后面要加的功能不能加上来和现有的设计不一致 大概设想: 注释和java的保持一致,但是支持 /* * 这种方 <a href="https://www.cnblogs.com/silentdoer/p/17871379.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17852733.html
Dart通过Ffi来实现字符串类型在Isolate里共享的方法 - Silentdoer
其实就是将字符串转换为字节数组,然后用\0作为结尾表示字符串的结束; 这样就可以定义一个字节数组作为字符串的容器(当然会有要求字符串不能超长,否则会截断,和C语言的字符串使用方式很像了) 而且\0在java,js里打印都是会没有任何显示的(但是会占用字节),所以很适合当作字符串结尾来用(因为\0在字
2023-11-23T14:58:00Z
2023-11-23T14:58:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】其实就是将字符串转换为字节数组,然后用\0作为结尾表示字符串的结束; 这样就可以定义一个字节数组作为字符串的容器(当然会有要求字符串不能超长,否则会截断,和C语言的字符串使用方式很像了) 而且\0在java,js里打印都是会没有任何显示的(但是会占用字节),所以很适合当作字符串结尾来用(因为\0在字 <a href="https://www.cnblogs.com/silentdoer/p/17852733.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17848195.html
Java Young GC和Old GC的概念 - Silentdoer
1.java内存模型里有年轻代和老年代的概念; 年轻代:顾名思义其实就是新创建的堆内存对象都会在年轻代里; 老年代:就是年轻代里的对象经过一定时间后"变老"了,进入老年代; 那年轻代的对象 什么时候 进入老年代 呢? 默认情况下是 对象 在年轻代 的GC 15次后 仍然存活(即不是那种创建后很快就释
2023-11-22T01:35:00Z
2023-11-22T01:35:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】1.java内存模型里有年轻代和老年代的概念; 年轻代:顾名思义其实就是新创建的堆内存对象都会在年轻代里; 老年代:就是年轻代里的对象经过一定时间后"变老"了,进入老年代; 那年轻代的对象 什么时候 进入老年代 呢? 默认情况下是 对象 在年轻代 的GC 15次后 仍然存活(即不是那种创建后很快就释 <a href="https://www.cnblogs.com/silentdoer/p/17848195.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17846492.html
java finally一定会执行吗? - Silentdoer
1.答案是不一定,而且很容易弄出不执行的情况; 最简单的:在IDEA上执行: try { log("aaa"); Thread.sleep(10000); log("bbbb"); } catch(Exception e) { log("ddd"); } finally{ log("eee"); }
2023-11-21T06:17:00Z
2023-11-21T06:17:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】1.答案是不一定,而且很容易弄出不执行的情况; 最简单的:在IDEA上执行: try { log("aaa"); Thread.sleep(10000); log("bbbb"); } catch(Exception e) { log("ddd"); } finally{ log("eee"); } <a href="https://www.cnblogs.com/silentdoer/p/17846492.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17827452.html
工厂模式的本质 - Silentdoer
转自知乎大神大宽宽的文章:https://www.zhihu.com/question/42975862(禁言了连收藏都不让收藏) 【通篇看下来,Factory要解决的是,无法动态创建类型的问题(虽然反射可以),即一个new方法,可以动态传入类型名,部分参数来动态创建该类型名实例和初始化】 【而且还
2023-11-12T09:42:00Z
2023-11-12T09:42:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】转自知乎大神大宽宽的文章:https://www.zhihu.com/question/42975862(禁言了连收藏都不让收藏) 【通篇看下来,Factory要解决的是,无法动态创建类型的问题(虽然反射可以),即一个new方法,可以动态传入类型名,部分参数来动态创建该类型名实例和初始化】 【而且还 <a href="https://www.cnblogs.com/silentdoer/p/17827452.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17377880.html
抢占式调度理解 - Silentdoer
1.抢占式调度应该这样理解,调度那肯定是调度器调度,比如操作系统; 因此这个抢占式是指操作系统会抢占式调度线程,线程A获得了CPU后,过一段时间会被操作系统给抢掉给其他线程; 抢占式还有个重要概念是,线程有优先级,优先级高的线程可以通过操作系统抢占CPU 调度肯定是调度器来调度,所以对于Linux系
2023-11-12T09:28:00Z
2023-11-12T09:28:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】1.抢占式调度应该这样理解,调度那肯定是调度器调度,比如操作系统; 因此这个抢占式是指操作系统会抢占式调度线程,线程A获得了CPU后,过一段时间会被操作系统给抢掉给其他线程; 抢占式还有个重要概念是,线程有优先级,优先级高的线程可以通过操作系统抢占CPU 调度肯定是调度器来调度,所以对于Linux系 <a href="https://www.cnblogs.com/silentdoer/p/17377880.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17803479.html
CopyOnWriteArrayList和Vector的区别 - Silentdoer
1.Vector的get方法也会加锁,即get期间是无法set或者add或remove的; 2.CopyOnWriteArrayList是get不加锁,但是add、set、remove等操作是会加锁的,而且注意CopyOnWriteArrayList加锁也是在方法一开始就加锁 ,而不是之前自己理解的
2023-11-12T09:27:00Z
2023-11-12T09:27:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】1.Vector的get方法也会加锁,即get期间是无法set或者add或remove的; 2.CopyOnWriteArrayList是get不加锁,但是add、set、remove等操作是会加锁的,而且注意CopyOnWriteArrayList加锁也是在方法一开始就加锁 ,而不是之前自己理解的 <a href="https://www.cnblogs.com/silentdoer/p/17803479.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17822076.html
java sleep和wait方法的区别,可重入锁的概念 - Silentdoer
1.sleep是Thread里的静态方法,表示将当前线程睡眠一段时间的意思,它不会释放在此线程此时synchronized(lock)的lock对象的锁; 2.wait方法是任意对象都有的方法,任意对象都能被synchronized,当对对象obj.wait()时,如果当前线程已经通过synchro
2023-11-12T09:27:00Z
2023-11-12T09:27:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】1.sleep是Thread里的静态方法,表示将当前线程睡眠一段时间的意思,它不会释放在此线程此时synchronized(lock)的lock对象的锁; 2.wait方法是任意对象都有的方法,任意对象都能被synchronized,当对对象obj.wait()时,如果当前线程已经通过synchro <a href="https://www.cnblogs.com/silentdoer/p/17822076.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/silentdoer/p/17825693.html
Function函数类型和class类型的异同 - Silentdoer
比如: typedef FuncType = String Function(String str); 然后我们就可以: FuncType aa = (String str) => str.trim(); aa(" ff"); // 或aa.call(" ff"),执行返回"ff" 但是它是可以转换
2023-11-12T09:27:00Z
2023-11-12T09:27:00Z
Silentdoer
https://www.cnblogs.com/silentdoer/
【摘要】比如: typedef FuncType = String Function(String str); 然后我们就可以: FuncType aa = (String str) => str.trim(); aa(" ff"); // 或aa.call(" ff"),执行返回"ff" 但是它是可以转换 <a href="https://www.cnblogs.com/silentdoer/p/17825693.html" target="_blank">阅读全文</a>