未使用volatile下的双重检查锁
public class DoubleCheckedLocking { // 1 |
public class DoubleCheckedLocking { // 1 |
为了实现volatile
的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。
对于编译器来说,发现一个最优布置来最小化插入屏障的总数几乎不可能。为了,JMM采取保守策略:
《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第十一章
连接
的本质就是把各个连接表中的记录都取出来依次匹配的组合加入结果集并返回给用户。
【🌰栗子】
mysql> CREATE TABLE t1 (m1 int, n1 char(1)); |
把t1
和t2
两个表连接起来的过程如下图所示:
上述的结果集即笛卡尔积
。
《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第十章
MySQL Server
中有查询优化器
的模块,一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个执行计划
,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是什么样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。执行计划就需要涉及到单表查询方法概念。
问题:volatile如何保证可见性的?对volatile修饰的变量进行写操作时,CPU会做什么事?
比如:
instance = new Singleton(); // instance是volatile变量 |
将上述代码转变成汇编代码:
0x01a3de1d: moveb $0×0, 0×1104800(%esi); |
多线程并发编程中,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”,可见性的意思是当一个线程修改一个共享变量时,另外一个线程能够读到这个修改的值。如果volatile变量修饰符使用恰当,它比synchronized使用的执行成本更低,因为它不会引起线程的上下文切换和调度。
class MonitorExample { |