/images/avatar.png

ThreadPoolExecutor源码学习

属性字段说明

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//高3位:表示当前线程池运行状态   除去高3位之后的低位:表示当前线程池中所拥有的线程数量
    private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
    //表示在ctl中,低COUNT_BITS位 是用于存放当前线程数量的位。
    private static final int COUNT_BITS = Integer.SIZE - 3;
    //低COUNT_BITS位 所能表达的最大数值。 000 11111111111111111111 => 5亿多。
    private static final int CAPACITY   = (1 << COUNT_BITS) - 1;

    // runState is stored in the high-order bits
    //111 000000000000000000  转换成整数,其实是一个负数
    private static final int RUNNING    = -1 << COUNT_BITS;
    //000 000000000000000000
    private static final int SHUTDOWN   =  0 << COUNT_BITS;
    //001 000000000000000000
    private static final int STOP       =  1 << COUNT_BITS;
    //010 000000000000000000
    private static final int TIDYING    =  2 << COUNT_BITS;
    //011 000000000000000000
    private static final int TERMINATED =  3 << COUNT_BITS;

    // Packing and unpacking ctl
    //获取当前线程池运行状态
    //~000 11111111111111111111 => 111 000000000000000000000
    //c == ctl = 111 000000000000000000111
    //111 000000000000000000111
    //111 000000000000000000000
    //111 000000000000000000000
    private static int runStateOf(int c)     { return c & ~CAPACITY; }

    //获取当前线程池线程数量
    //c == ctl = 111 000000000000000000111
    //111 000000000000000000111
    //000 111111111111111111111
    //000 000000000000000000111 => 7
    private static int workerCountOf(int c)  { return c & CAPACITY; }

    //用在重置当前线程池ctl值时  会用到
    //rs 表示线程池状态   wc 表示当前线程池中worker(线程)数量
    //111 000000000000000000
    //000 000000000000000111
    //111 000000000000000111
    private static int ctlOf(int rs, int wc) { return rs | wc; }

MySQL-Buffer Pool 学习

一条sql执行基本流程

在老版本的MySQL中sql通过连接进来时会有查询缓存这一块的逻辑。

查询解析器解析sql 是否正确后,然后基本优化sql,生成执行计划,选择引擎执行。

而InnoDB 在执行时 为了保证对数据的执行更快,省去磁盘IO开销 引入了Buffer Pool

MySQL-事务学习

多事务并发处理数据产生的问题

脏读脏写 都是因为读取了事务未提交时的事务回滚情况

脏写

事务A与事务B同时更新一条数据,由于其中一个事务回滚 导致另外事务执行成功的数据不存在了。

脏读

事务A还没提交事务时事务B拿到值做了大量的操作,事务A回滚后出现的数据异常问题。

不可重复读 与可重复读

事务A修改了值并且提交了事务 B读取到 然后B在执行事务期间 C又修改了值并且提交了。这时B读取到的值又变了。 这就时不可重复读问题。 可重复读就相反 并且读取到的值是相同的。

幻读

其实就是在事务执行期间第二次查询相比第一次查询出现了之前没出现过的数据。