- 博客(21)
- 问答 (1)
- 收藏
- 关注
原创 Synchronized 锁升级
若某一线程持有临界资源的偏向锁且未释放,再有其他线程竞争该资源时,当上一线程释放时,发现 markword 的锁标志变成了重量级锁,但实际还是应该经过了轻量级锁这个环节,只是无法打印出该时刻的 markword。Compare And Swap 的是 markword头信息, 所以轻量级锁会自动释放锁,而偏向锁或重量级锁都不会,因为这二者不使用CAS自旋,资源上重量级锁后,后来的竞争线程直接阻塞。当一个线程获取该资源的偏向锁后,调用了wait() 方法,可以使偏向锁直接升级为重量级锁。
2024-07-12 23:18:37
270
原创 类加载过程(准备阶段)
准备阶段为类变量(static 修饰的变量, 非static修饰的为实例变量--即使是final修饰的)分配内存,为其赋默认值,非代码中的初始值;static final 修饰的直接赋初始值(final 只能赋值一次),仍存放于方法区(其中的class文件常量池);final修饰的成员变量,在构造函数中被初始化值的,存在于堆中。类变量存放于方法区(元空间)中;方法内部变量存在于本地方法栈中;普通成员变量存在与堆中;
2024-07-12 23:13:02
176
原创 JVM 几种垃圾回收器对比
这是 G1 相对于 CMS 的另一个大优势,降低停顿时间是 G1 和 CMS 共同的关注点,但 G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为 M 毫秒的时间片段内,消耗在垃圾收集上的时间不得超过 N 毫秒。重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短;此阶段重新标记前面提到的STAB队列中的对象(例子中的C对象),还会处理弱引用。
2024-07-12 11:24:49
820
原创 synchronized 关键字
可以修饰构造方法内部的代码块(但没有应用场景,应该只是没有专门去做排除)。构造方法本身线程安全,且无法被实例访问。修饰非静态方法:锁对象实例。修饰代码块:锁类或对象实例。
2024-07-12 11:09:47
191
原创 HashMap
JDK1.8 之后,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)。就是:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。扩容后原有数据重新分布,按原始容量两倍扩容(默认初始16),其容量全程都是2的n次、其他扩容条件:数组元素数量满数组容量的75%,进行两倍扩容(64之前也会)通过拉链法解决冲突。
2024-07-12 11:07:55
161
原创 String、StringBuffer、StringBuilder
单线程操作字符串缓冲区下操作大量数据: 适用。多线程操作字符串缓冲区下操作大量数据: 适用。操作少量的数据: 适用。
2024-07-12 11:01:15
130
原创 MySQL 三大日志
redo log 是循环写,其中存在两个指针 write pos 和 checkpoint,write pos 表示当前写入位置,checkpoint 表示已持久化到磁盘数据页的 redo log 的位置标记,即checkpoint 之前的 redo log 都已同步到数据磁盘页。当缓冲区满时,会触发日志的刷新,将日志写入磁盘。Checkpoint(检查点):InnoDB 定期会执行检查点操作,将内存中的脏数据(已修改但尚未写入磁盘的数据)刷新到磁盘,并且会将相应的重做日志一同刷新,以确保数据的一致性。
2024-07-12 10:47:03
681
原创 索引失效情况
但没有扫描全表磁盘数据页,而是扫描联合索引树的全部叶子节点,因为仅仅一个 age 不是任何最左匹配索引树的 key,即使联合索引的 B+ 树中包含了 age,但无法对单独的 age 实现多路查找逻辑,无法从上往下查找,只能扫描整个 B+ 树的叶子链。走联合索引,最后 Extra 字段 的 Using index 表示没有回表,直接使用索引文件中的数据。这两条语句都会走联合索引,普通索引等值匹配,需要回表。非等值查询,且数据存在,索引不失效,进行范围查询。非等值查询,且数据不存在,索引失效,走全表扫描。
2024-07-12 10:29:23
214
原创 Innodb 索引
当查询条件中的字段都在某个联合索引内,即该联合索引的键包含了所有的查询字段,在 B+ 树查找过程中,可以直接判断全部的查询条件,直接返回满足所有条件的主键值,再根据主键值经过一次聚簇索引的回表返回符合条件的记录。在 MySQL 的 InnoDB 的表中,当没有显示的指定表的主键时,InnoDB 会自动先检查表中是否有唯一索引且不允许存在 null 值的字段,如果有,则选择该字段为默认的主键,否则 InnoDB 将会自动创建一个 6Byte 的自增主键。”,而其余的索引都作为。
2024-07-12 10:03:46
262
原创 MVCC 可见性算法
因为需要严格保证小于 m_up_limit_id 的事务均为当前事务创建时已提交的事务,所以 m_up_limit_id 对应的是当前事务创建时 id 最小的活跃事务,但其后可以有一些事务较快地完成了提交。6、若不可见,从该记录行的 DB_ROLL_PTR 所指向的 undo log 链中,取出下一个 DB_TRX_ID,递归地进行步骤3 - 步骤5,直到找到满足的快照版本或返回空。3、若该 DB_TRX_ID < m_up_limit_id,对应记录先于当前事务提交,可见;
2024-07-12 09:59:34
407
原创 Mysql 锁
对连续逻辑范围内的记录加锁,不包含记录本身(不锁已存在的记录,只锁范围内不存在的间隙)。对连续逻辑范围内的记录加锁,包含记录本身。Next-Key Lock:锁住的区间为 [10, 15) <== [10,+∞) ∩ (-∞, 15)行级锁:只针对当前操作的行记录进行加锁;读写锁总结:表级锁或行级锁都可以是读锁或写锁;锁表流程:需要锁表时,若该表有意向锁或表锁,则无法再锁表,否则可以锁。意向锁是表级锁,用于判断表中是否有行锁。排他锁(X锁) = 写锁(独占锁)记录锁(Record Lock)
2024-07-12 09:54:58
323
原创 MySQL事务隔离级别
在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。一个事务读取数据并且对数据进行了修改,这个修改对其他事务来说是可见的,即使当前事务没有提交。这时另外一个事务读取了这个还未提交的数据,但第一个事务突然回滚,导致数据并没有被提交到数据库,那第二个事务读取到的就是脏数据,这也就是脏读的由来。在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。
2024-07-12 09:48:31
338
原创 Kafka 消息丢失问题
自动提交的话会有一个问题,试想一下,当消费者刚拿到这个消息准备进行真正消费的时候,突然挂掉了,消息实际上并没有被消费,但是 offset 却被自动提交了。表示只有所有 ISR 列表的副本全部收到消息时,生产者才会接收到来自服务器的响应. 这种模式是最高级别的,也是最安全的,可以确保不止一个 Broker 接收到了消息. 该模式的延迟会很高。拉取到消息即提交:会有消息丢失的风险,和自动提交一样。在默认配置下,当消费异常会进行重试,重试多次后会跳过当前消息,继续进行后续消息的消费,不会一直卡在当前消息。
2024-07-12 09:42:34
350
原创 DataGrip 连接阿里云服务器 MySql 数据库
注意仅仅使用命令在服务器上开启防火墙端口是不够的(甚至我都没有开防火墙,全靠安全组),这个安全组实际起到了防火墙的作用;这篇文章也提到了需要注释掉这行代码,不过可能是因为mysql版本不同的问题,导致实际需要修改的配置文件不是同一个。不仅阿里云是这样的,之前使用过的腾讯云也有类似的配置。1、数据库需要配置用户和密码,以便在 DataGrip 中使用 用户和密码 登录;以上步骤完成之后在 DataGrip 中正常创建连接即可。地址进行监听,否则将导致外部无法远程连接。以取消MySQL服务对。
2024-03-06 15:26:33
1743
1
原创 Java移位运算符
无符号右移其实就是将符号位也当成一个普通的位,因为正数的符号位为0,所以对正数来说,无符号右移跟有符号右移是一样的。而对负数来说,无符号右移是在高位插入0,而有符号右移是在高位插入0。-3的补码是 1111 1111 1111 1111 1111 1111 1111 1101;即 -3 ==> 2147483646 (10进制)。即 -3 ==> -6 (10进制);即 -3 ==> -2 (10进制);即 3 ==> 6 (10进制);即 3 ==> 1 (10进制);对补码再取补,得到对应的原码。
2023-03-09 20:20:03
1654
2
原创 Permission denied (publickey).
deepin 下 向远程仓库同步文件(git push origin master)的时候出现 “Permission denied (publickey).”。测试一下ssh -T git@github.com,发现连接不上,试了好多网上的方法,但都不适合我的情况。后来自己发现 我生成ssh key的时候ssh key的文件id_rsa.pub是保存在root下的/root/.ssh/id_rs...
2018-04-29 21:36:12
791
原创 某些自己易犯的错误
Blog 2讲一些最近在写代码过程中容易错且自己不太容易发现的错误吧。1. 数值定义上,int型和long long型。如果int定义m=10^7,而m会有n=10^3的类似数据累加,就会溢出,导致Wrong Answer。所以要看题目到底是定义成int还是long long,有时候不太确定的或者在边缘附近的,就简单地定义成long long好了。2. Runtime Er
2017-03-31 20:27:20
307
原创 About C
Blog 1About C 从以前A题的情况来看,一些常见的语法错误还是小事,如关键词的拼错,变量和函数名的大小写,忘记了“,”、“&”等符号,因为在编译的时候可以很容易地根据报错来修改出这些问题。但有些问题会比较严重,以下列举我能想到的一些: 1. 数组和字符数组的下标还有链表的顺序等,弄错的话有时只是移动一个位置的问题,有时会导致数组越界导致生 随机数
2017-02-25 18:30:43
311
空空如也
不同变量的值相等的时候 地址也相同
2018-10-11
TA创建的收藏夹 TA关注的收藏夹
TA关注的人