youyichannel

志于道,据于德,依于仁,游于艺!

0%

未使用volatile下的双重检查锁

public class DoubleCheckedLocking { // 1
private static Instance instance; // 2

public static Instance getInstance() { // 3
if(instance == null) { // 4 第一次检查
synchronized(DoubleCheckedLocking.class) { // 5 加锁
if(instance == null) { // 6 第二次加锁
instance = new Instance(); // 7 问题根源
}
} // 8
} // 9
return instance; // 10
} // 11
}
阅读全文 »

Volatile实现原理 —— 禁止指令重排序

为了实现volatile的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。

对于编译器来说,发现一个最优布置来最小化插入屏障的总数几乎不可能。为了,JMM采取保守策略:

阅读全文 »

《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第十一章

一、连接简介

1.1 连接的本质

连接的本质就是把各个连接表中的记录都取出来依次匹配的组合加入结果集并返回给用户。

【🌰栗子】

mysql> CREATE TABLE t1 (m1 int, n1 char(1));
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE t2 (m2 int, n2 char(1));
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO t1 VALUES(1, 'a'), (2, 'b'), (3, 'c');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> INSERT INTO t2 VALUES(2, 'b'), (3, 'c'), (4, 'd');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

t1t2两个表连接起来的过程如下图所示:

上述的结果集即笛卡尔积

阅读全文 »

《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第十章

MySQL Server中有查询优化器的模块,一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是什么样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。执行计划就需要涉及到单表查询方法概念。

阅读全文 »

Volatile的实现原理 —— 可见性

问题:volatile如何保证可见性的?对volatile修饰的变量进行写操作时,CPU会做什么事?

比如:

instance = new Singleton(); // instance是volatile变量

将上述代码转变成汇编代码:

0x01a3de1d: moveb $0×0, 0×1104800(%esi);
0x01a3de24: lock addl $0×0,(%esp);
阅读全文 »

Volatile的定义

多线程并发编程中,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”,可见性的意思是当一个线程修改一个共享变量时,另外一个线程能够读到这个修改的值。如果volatile变量修饰符使用恰当,它比synchronized使用的执行成本更低,因为它不会引起线程的上下文切换和调度。

阅读全文 »

锁的获取和释放的内存语义

class MonitorExample {
int a = 0;
public synchronized void write() { // 1
a++; // 2
} // 3

public synchronized void read() { // 4
int i = a; // 5
// ...
} // 6
}
阅读全文 »