摘要: 记一次主线程等待子线程结束的多种方法的学习 在学习多线程时,最开始遇到的问题其实是“计算子线程运行时间”,写到最后发现本文和标题更为符合,但是仍然基于问题:“在主线程中获取子线程的运行时间”。 while循环 对于“主线程如何获取子线程总运行时间”的问题,最开始想到的是使用while循环进行轮询: 阅读全文
posted @ 2019-06-10 19:12 code-blog 阅读(72425) 评论(13) 推荐(12) 编辑
摘要: 问:有哪些常见的SQL优化手段? 这也是个高频面试题,并且并非面试造火箭的那种问题,实际项目中也会有非常多的地方需要进行SQL优化 避免使用 Select * select *中,无用字段会增加网络带宽消耗,特别是varchar、blob、text等大字段 select *无法使用Mysql优化器覆 阅读全文
posted @ 2024-04-15 17:36 code-blog 阅读(13) 评论(0) 推荐(0) 编辑
摘要: 缓存雪崩:同一时间段内大量缓存失效或Redis服务宕机,导致大量请求到达数据库,给数据库带来巨大压力。 解决方案: 给不同的Key的TTL(存活时间)添加一个随机值 Redis宕机时:利用Redis集群提高服务可用性(哨兵模式、集群模式) 给缓存业务添加降级限流策略(保底策略,也可以解决穿透、击穿、 阅读全文
posted @ 2024-04-08 07:14 code-blog 阅读(3) 评论(0) 推荐(0) 编辑
摘要: 缓存击穿:缓存中一个热点数据过期或失效时,由于该数据非常受欢迎,会有大量请求直接打到数据库上,导致数据库负载增大、相应变慢甚至瘫痪。 解决方式: 互斥锁 在查询数据库之前首先获取分布式锁,更新redis之后再释放锁,可以保证数据的强一致性。 优缺点: 优点:强一致性 缺点:性能差 逻辑过期 数据本身 阅读全文
posted @ 2024-04-07 21:33 code-blog 阅读(4) 评论(0) 推荐(0) 编辑
摘要: 缓存穿透:查询一个不存在的数据,Mysql查询不到也没有写入缓存,导致每次请求都会查询数据库。(比如恶意请求) 解决方案: 缓存空数据:返回数据为空时仍然缓存(但是需要加过期时间)。 优点:简单 缺点:消耗内存,可能存在数据不一致情况。 布隆过滤器 布隆过滤器使用Bitmap(位图)来记载一个数据是 阅读全文
posted @ 2024-04-06 22:43 code-blog 阅读(3) 评论(0) 推荐(0) 编辑
摘要: Java 代理的几种实现方式 静态代理 通过创建一个代理类来控制对目标对象的访问(也就是手动编写一个代理类)。 静态代理的优点是易于理解和实现,缺点是每个接口都需要定义一个代理类,而且功能较弱。 动态代理 动态代理分两种,Proxy接口代理和CGLib代理 接口代理 Proxy 代理是JDK内置代理 阅读全文
posted @ 2024-04-02 22:19 code-blog 阅读(9) 评论(0) 推荐(0) 编辑
摘要: 哈希计算(Hashing)是一种将数据通过哈希函数(Hash Function)转换成固定长度的值(hash value)的过程,是一个通用的计算方式。 在Java中的表现就是hashcode()方法,在Object类上,常用于HashMap、HashSet等集合中,用于快速查找、唯一约束等作用。 阅读全文
posted @ 2024-03-29 13:49 code-blog 阅读(6) 评论(0) 推荐(0) 编辑
摘要: 相同点: 都不能实例化 都可以被实现或者继承 继承或者实现的子类需要实现全部抽象方法,否则需要声明为抽象类 不同点: 不同点 抽象类 接口 声明 abstract interface 继承/实现 extends implements 构造器 可以有构造器 不能有构造器 方法 抽象方法和具体方法 抽象 阅读全文
posted @ 2024-03-26 22:05 code-blog 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 只列出主要新特性 Java 8 Lambda 表达式 函数式接口 Stream API 新的日期和时间 API 默认方法 Optional类 Java 9-11 Java 9 模块化系统 G1成为默认垃圾回收器(之前是CMS,Concurrent Mark-Sweep,即 新生代+老年代 标记清除。 阅读全文
posted @ 2024-03-25 22:54 code-blog 阅读(14) 评论(0) 推荐(0) 编辑
摘要: 本文旨在总结多线程情况下集合的使用 Java中的集合大致以下三个时期: 第一代线程安全集合类 以Vector、HashTable为代表的初代集合,使用synchronized在修饰方法,从而保证线程安全。 缺点:效率低。 代码示例 Vectoradd方法源码 /** * Appends the sp 阅读全文
posted @ 2024-03-25 22:08 code-blog 阅读(6) 评论(0) 推荐(0) 编辑
摘要: 本文为分布式学习笔记,参考了JavaGuide 各种锁概念介绍: 可重入锁:允许线程在持有锁的情况下多次获取同一个锁,而不会被自己所持有的锁所阻塞,这种特性也被称为锁的可重入性。 自旋锁:与传统的互斥锁不同,自旋锁不会将线程挂起(进入阻塞状态),而是在获取锁时不断循环尝试获取,直到成功为止,因此称为 阅读全文
posted @ 2024-03-22 10:33 code-blog 阅读(8) 评论(0) 推荐(0) 编辑
摘要: 本文为分布式学习笔记,参考了JavaGuide 设计分布式ID有两种思路: 第一种是让所有获取ID的机器从同一个地方获取,ID生成器只需要简单自增即可。 第二种是通过一定的算法,使各个机器产生的ID不重复,这也是一种方式。 同一ID生成方式 数据库 数据库主键自增 利用数据库主键自增来产生唯一ID, 阅读全文
posted @ 2024-03-19 13:58 code-blog 阅读(3) 评论(0) 推荐(0) 编辑
摘要: 数据库 Tips 时间和日期互转 数据库 当前时间 字符串转时间 时间转字符串 格式 dual 表 MySQL NOW() STR_TO_DATE DATE_FORMAT %Y-%m-%d %H:%i:%s 可选 Oracle SYSTIMESTAMP、SYSDATE TO_TIMESTAMP、TO 阅读全文
posted @ 2024-02-28 16:28 code-blog 阅读(2) 评论(0) 推荐(0) 编辑
摘要: Effective Java 阅读笔记 第十二章 序列化 第 85 条 其他方法优先于 Java 本身的序列化 Java 本身的序列化漏洞过多,很容易被攻击。避免被序列化攻击的最好方式就是不要反序列化任何字节流,并且新的系统中没有任何理由使用 Java 本身的序列化。 JSON 和 Protobuf 阅读全文
posted @ 2024-02-21 16:19 code-blog 阅读(1) 评论(0) 推荐(0) 编辑
摘要: Effective Java 阅读笔记 第十一章 并发 第 78 条 同步访问共享的可变数据 多线程访问变量时,需要进行同步,否则就会产生并发问题。 同步代码块、加锁等 或者直接不共享变量,也就是将可变数据限制在单个线程内。 ThreadLocal这种 第 79 条 避免过度同步 为了避免活性失败和 阅读全文
posted @ 2024-02-21 16:18 code-blog 阅读(1) 评论(0) 推荐(0) 编辑
摘要: Effective Java 阅读笔记 第十章 异常 第 69 条 只针对异常的情况才使用异常 说白了就是不要吧你的业务逻辑用异常来写。 举个反例 比如用抛出异常来遍历一个数组: try { int i = 0; while(true) { range[i++].doSomething(); } } 阅读全文
posted @ 2024-02-21 16:18 code-blog 阅读(1) 评论(0) 推荐(0) 编辑