12 2020 档案
摘要:CountDownLatch类 CountDownLatch 类在创建实例的时候,需要在构造函数中传入倒数次数,然后由需要等待的线程去调用 await 方法开始等待,而每一次其他线程调用了 countDown 方法之后,计数便会减 1,直到减为 0 时,之前等待的线程便会继续运行。 构造方法: Co
阅读全文
摘要:该类自 JDK 8 加入,是为了进一步优化读性能,它的特点是在使用读锁、写锁时都必须配合【戳】使用 读锁: long stamp = lock.readLock(); lock.unlockRead(stamp); 写锁: long stamp = lock.writeLock(); lock.un
阅读全文
摘要:final 标记的类不能被继承 。提高安全性,提高程序的可读性。 final标记的方法不能被子类重写。 final标记的变量,只能被赋值一次,即称为常量。 final和abstract这两个关键字是反相关的,final类就不可能是abstract的。 final方法在编译阶段绑定,称为静态绑定(st
阅读全文
摘要:volatile 1.volatile保证可见性 代码比较简单,我就不贴出来了。 子线程t从主内存读取到数据放入其对应的工作内存 将flag的值更改为true,但是这个时候flag的值还没有写会主内存 此时main方法main方法读取到了flag的值为false 当子线程t将flag的值写回去后,失
阅读全文
摘要:一、as-if-serial as-if-serial语义的意思是:不管怎么重排序(编译器和处理器为了提供并行度),(单线程)程序的执行结果不能被改变。编译器,runtime和处理器都必须遵守as-if-serial语义。as-if-serial语义把单线程程序保护了起来,遵守as-if-seria
阅读全文
摘要:Redis的持久化机制是什么?各自的优缺点? Redis提供两种持久化机制RDB和AOF机制:
阅读全文
摘要:为什么单线程redis还这么快 绝大部分请求时纯粹的内存操作,非常快速10W+ 采用单线程,避免了不必要的上下文切换和竞争条件,原子性保证关键。其中单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块还是用了多线程,例如持久化模块。 非阻塞IO多路复用,这样提高了redis的
阅读全文
摘要:微服务理论 微服务和SOA的区别(这里就把单体应用也写一下) **单体服务:**Web应用程序发展的早期,大部分web工程(包含前端页面,web层代码,service层代码,dao层代码)是将所有的功能模块,打包到一起并放在一个web容器中运行。 优点: 所有的功能集成在一个项目工程中 项目架构简单
阅读全文
摘要:wait notify 原理 Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态 BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片 BLOCKED 线程会在 Owner 线程释放锁时唤醒 WAITING 线程会在
阅读全文
摘要:所谓的“线程八锁”,其实就是考察 synchronized 锁住的是哪个对象 情况1:12 或 21 锁住的为同一对象,2个线程都有可能执行 @Slf4j(topic = "c.Number") class Number{ public synchronized void a() { log.deb
阅读全文
摘要:在静态方法和非静态方法上加 Synchronized的区别 非静态方法 class Test{ public synchronized void test() { } } 等价于 class Test{ public void test() { synchronized(this) { } } }
阅读全文
摘要:3种线程阻塞唤醒 wait/notify /** * @author WGR * @create 2020/12/29 -- 0:28 */ public class Test6 { private static Object objectLock = new Object(); public st
阅读全文
摘要:ReentrantLock源码探究 后面的流程可以结合:https://www.cnblogs.com/dalianpai/p/14202617.html 一起看 相对于 synchronized 它具备如下特点 可中断 可以设置超时时间 可以设置为公平锁 支持多个条件变量 与 synchroniz
阅读全文
摘要:这个图参考尚硅谷的大厂面试题第三季的AQS,如果感觉看的不方便的,可以联系我发给你。
阅读全文
摘要:1、Semaphore 是什么 Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。 可以把它简单的理解成我们停车场入口立着的那个显示屏,每有一辆车进入停车场显示屏就会显示剩余车位减1,每有一辆车从停车场出去,显示屏上显示的剩余车
阅读全文
摘要:虚拟机栈 由于跨平台性设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容器实现,缺点是性能下降,实现同样的功能需要更多的指令。栈解决的是程序运行的问题,即程序如何运行,如何处理数据。生命周期和线程一致,它保存方法的局部变量,部
阅读全文
摘要:说说你对程序计数器的理解 作用 PC寄存器用来存储指向下一条命令的地址,也是即将执行的指令代码。由执行引擎读取下一条指令。 为什么要有PC寄存器 因为CPU需要不停的切换各个线程,这时候切换回来,就知道接着从哪开始继续执行。 为什么PC寄存器要设定线程私有 因为在CPU来回切换的时候,为了确保准确记
阅读全文
摘要:深入解析synchronized 1 常见的几个并发问题 1.可见性问题 案例演示:一个线程根据boolean类型的标记flag, while循环,另一个线程改变这个flag变量的值,另一个线程并不会停止循环。 /** * @author WGR * @create 2020/12/22 -- 20
阅读全文
摘要:如何在IDEA中使用jcstress进行并发压力测试 在研究高并发的时候,偶然发现这个,还是有点好用的。 测试类 /** * @author WGR * @create 2020/12/22 -- 20:48 */ @JCStressTest @Outcome(id = {"1","4"}, exp
阅读全文
摘要:创建线程的四种方式: 继承Thread类,并复写run方法,创建该类对象,调用start方法开启线程。此方式没有返回值。 // 创建线程对象 Thread t = new Thread() { public void run() { // 要执行的任务 } }; // 启动线程 t.start()
阅读全文
摘要:原子性:undo log 事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部失败回滚。 undo log记录了回滚操作的日志,如果要撤销,按照undo log的回滚日志执行一遍就可以了(保证了原子性) 持久性:redo log 指一个事务一旦提交,它对数据库
阅读全文
摘要:在RR级别下,快照读是通过MVVC(多版本控制)和undo log来实现的,当前读是通过加record lock(记录锁)和gap lock(间隙锁)来实现的。在mysql中通过MVCC快照读和next-key(当前读)两种模式解决幻读问题。 关于MVVC MySQL InnoDB存储引擎,实现的是
阅读全文
摘要:InnoDB 行锁 行锁介绍 行锁特点 :偏向InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 InnoDB 与 MyISAM 的最大不同有两点:一是支持事务;二是 采用了行级锁。 InnoDB 的行锁模式 InnoDB 实现了以下两种类型的行锁
阅读全文
摘要:1). 全值匹配 ,对索引中所有列都指定具体值。 改情况下,索引生效,执行效率高。 explain select * from tb_seller where name='小米科技' and status='1' and address='北京市'\G; 2). 最左前缀法则 如果索引了多列,要遵守
阅读全文
摘要:InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务; InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败; Inno
阅读全文
摘要:Mybatis 是怎么支持延迟加载 答:Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoad
阅读全文
摘要:Tomcat为什么要重写类加载器 出现的原因 无法实现隔离性:如果使用默认的类加载器机制,那么是无法加载两个相同类库的不同版本的,默认的累加器是不管你是什么版本的,只在乎你的全限定类名,并且只有一份。 **无法实现热替换:**jsp 文件其实也就是class文件,那么如果修改了,但类名还是一样,类加
阅读全文
摘要:JMM本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量的访问方式。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。 JMM关于同步的规定 线程解锁前,必须把共享变量的值刷新回主内存 线程加锁前,必须读取主内存的最新值到自己的工作内存 加锁解锁是同
阅读全文
摘要:怎么保证MQ的高可用 RocketMQ 采用的双主双从同步写的方法。 每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下: 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与
阅读全文
摘要:怎么保证消息的不丢失 原因 消息生产者没有成功发送到MQ Broker 消息发送给MQ Broker后,Broker 宕机后导致内存中的消息数据丢失 消费者获取到消息,但消费者还没有来得及处理宕机了,但此时MQ中的消息已经删除,消费者重启后不能再消费之前的消息 解决思路 消息发送者发送给MQ Bro
阅读全文
摘要:怎么保证消息的幂等性 出现非幂等性的情况 1、生产者已把消息发送到mq,在mq给生产者返回确认消息的时候网络中断,故生产者未收到确定信息,生产者认为消息未发送成功,但实际情况是,mq已成功接收到了消息,在网络重连后,生产者会重新发送刚才的消息,造成mq接收了重复的消息 2、消费者在消费mq中的消息时
阅读全文
摘要:MQ怎么解决消息堆积的问题 网上普通回答 修复consumer的问题,确保其恢复消费速度,然后将现有consumer都停止 临时建立好原先10倍或者20倍的queue数量 然后写一个临时的分发数据的consumer程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立
阅读全文
摘要:怎么解决Mysql的超大分页 用id优化 先找到上次分页的最大ID,然后利用id上的索引来查询,类似于select * from user where id>1000000 limit 100. 这样的效率非常快,因为主键上是有索引的,但是这样有个缺点,就是ID必须是连续的,并且查询不能有where
阅读全文
摘要:通过Tomcat访问静态文件 出现的问题:生产上安装的fastdfs+nginx,实现分布式存储和在线预览的功能。 但是生产上通过域名绑定nginx的服务器,然后转到F5,最后才在2台应用服务器进行负载均衡,但是办公电脑只能通过域名访问,F5和应用的IP根本ping不通,所以fastdfs的返回的U
阅读全文
摘要:说明 1.在第二步的时候用的是建造者模式,其中BaseBuilder抽象类就扮演建造者接口的角色,得到一个XmlConfigBuilder对象。主要用来解析maybatis-config.xml,是主要的人口,先在配置文件中查找configuration节点,然后开始解析各个子节点,这些信息都会保存
阅读全文
摘要:MySQL目前主要有以下几种索引类型: 普通索引 普通索引是 MySQL 中最基本的索引类型,它没有任何限制,唯一任务就是加快系统对数据的访问速度。允许重复值和空值。 唯一索引 唯一索引列的值必须唯一,允许有空值。 主键索引 主键索引是一种特殊的唯一索引,不允许值重复或者值为空。 组合索引 指多个字
阅读全文
摘要:btree索引和hash索引的区别 Hash 索引 优点:Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。 缺点: Hash 索引仅仅
阅读全文
摘要:说说逃逸分析和栈上分配 逃逸分析: 它是可以有效减少java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。它能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。 当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸。 当一个对象在方法中被定义后,它被
阅读全文
摘要:为什么会有TLAB(Thread Local Allocation Buffer)? • 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据; • 由于对象实例的创建在JVM中十分频繁,一次在并发环境下从堆区中划分内存空间是线程不安全的; • 为避免多个线程操作同一地址,需要使用加锁等机制,进
阅读全文
摘要:你了解对象分配规则吗 为新对象分配内存是一个非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收是否会在内存空间中产生内存碎片。 对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机
阅读全文
摘要:Java 对象的创建过程 1.1 类加载 虚拟机遇到new指令,首先检查这个指令的参数能否在元空间的常量池中定位到一个类的符号引用,并且看这个符号引用的类是否已经被加载,解析和初始化。如果没有,那么在双亲委派模式下,查找对应的class文件。 1.2 分配内存 对象所需内存大小根据加载的类来确定,为
阅读全文
摘要:Minor GC、Major GC、Full GC Minor GC 当年轻代空间不足时,就会触发Minor GC,这里的年轻代满指的是Eden满,Survivor满不会触发GC。(每次Minor GC 会清理年轻代的内存) 因为Java对象大多都具备朝生熄灭的特性,所以Minor GC非常频繁,一
阅读全文
摘要:说说常见的垃圾回收算法 标记-清除算法 标记:Collector从引用根节点开始遍历,标记所有引用的对象。一般是在对象的header中记录为可达对象。 清除:Collector对堆内存从头到尾进行线性的遍历,如果发现某个对象在其Header中没有标记为可达对象,则对其回收。 缺点 效率不高,标记和清
阅读全文
摘要:  mybatis在处理#时,会将sql中的#替换为?号,调用PreparedStatement的set方法来赋值。 (2)mybatis在处理$时,就是把$替换成变量的值。 (3)使用#可以有效的防止SQL注入,提高系统安全性。原因在于:预
阅读全文
摘要:1、tranlog flush 间隔调整 默认设置下,每个请求都flush,这是影响es写入速度的最大因素,需要调整translog持久化策略为周期性和一定大小的时候flush,例如: index.translog.durability: async 设置为async表示translog的刷盘策略按
阅读全文
摘要:1.内存到寄存器 2.寄存器自增 3.在写入到内存当中
阅读全文
摘要:Zookeeper的watch机制 概况:大体上讲 ZooKeeper 实现的方式是通过客服端和服务端分别创建有观察者的信息列表。客户端调用 getData、exist 等接口时,首先将对应的 Watch 事件放到本地的 ZKWatchManager 中进行管理。服务端在接收到客户端的请求后根据请求
阅读全文
摘要:ZAB 协议算法 ZooKeeper 最核心的作用就是保证分布式系统的数据一致性,而无论是处理来自客户端的会话请求时,还是集群 Leader 节点发生重新选举时,都会产生数据不一致的情况。为了解决这个问题,ZooKeeper 采用了 ZAB 协议算法。 ZAB 协议算法(Zookeeper Atom
阅读全文
摘要:具体的可以看之前的这篇博客,考的就是Redis的逐出算法。 达到最大内存后的,对被挑选出来的数据进行删除的策略 影响数据逐出的相关配置 检测易失数据(可能会过期的数据集server.db[i].expires ) ① volatile-lru:挑选最近最少使用的数据淘汰 ② volatile-lfu
阅读全文
摘要:   as rank, @g:=t.user_ty
阅读全文
摘要:一、概述 背景 Loki的第一个稳定版本于2019年11月19日发布,是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。 Grafana 对 Loki 的描述如下: Loki: like Prometheus, but for logs. Loki
阅读全文
摘要: 
浙公网安备 33010602011771号