Mysql
锁
全局锁
表级锁
表锁
表锁分为两类:表共享读锁(读锁)、表独占写锁(写锁)
读锁不会阻塞其他客户端的读,但是会阻塞写。写锁既会阻塞其他客户端的读,又会阻塞其他客户端的写。
元数据锁
元数据可以理解为表结构(表中数据类型、键值等);
当对表进行增删改查时、自动加入MDL读锁(此时防止替它线程修改表结构、从而导致读写不准确);当对表结构进行变更操作时、自动加入MDL写锁(此时要防止其它线程读到表结构)

注意,教程这儿错了,当对一张表进行查的时候,加MDL读锁SHARED_READ,当对一张表进行增删改的时候,加MDL写锁SHARED_WRITE,当对表结构进行变更操作,加排他锁EXCLUSIVE
意向锁
undo log和redo log的区别

MVCC








RC是读提交、每次查询都新建一个readreview;
其实不用记公式、找到事务开启前、已经提交的事务就行;

RR是可重复读、每次查询都用最开始的readview;
小结:

JAVA集合

多线程

线程和进程的区别

当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。

并发和并行的区别




创建线程的方式有哪些




小结:共有四种方式可以创建线程,分别是:
继承Thread类
实现runnable接口
实现Callable接口
线程池创建线程
使用runnable和callable都可以创建线程,它们有什么区别呢?

在启动线程的时候,可以使用run方法吗?run()和 start()有什么区别?

线程包括哪些状态、状态之间是如何变化的


阻塞状态就是当前线程没有拿到锁、要等待其它线程释放锁;
等待状态、就是当前线程获取到锁后、执行到里面的wait()、此时释放锁;其它线程获取锁、然后通知notify()、当当前线程再次获取到锁时、然后执行后续方法;
计时状态就是等待当前线程内的sleep(500)、时间过后继续执行;

新建T1、T2、T3三个线程,如何保证它们按顺序执行

notify()和notifyAll()有什么区别
notifyAll:唤醒所有wait的线程;notify:只随机唤醒一个wait线程
wait和sleep方法的不同

如何停止一个正在运行的线程

方法一:

线程1的方法会打印两次、然后线程关闭(线程1、主线程是并发的);
方法三:

synchronized关键字的底层原理


进阶回答
Monitor实现的锁属于重量级锁,你了解过锁升级吗?

重量级锁

对象怎么关联上的Monitor?
每个Java对象都可以关联一个Monitor 对象,如果使用synchronized给对象上锁(重量级)之后,该对象头的Mark Word 中就被设置指向Monitor对象的指针;
轻量级锁
在很多的情况下,在Java程序运行时,同步块中的代码都是不存在竞争的,不同的线程交替的执行同步块中的代码。这种情况下,用重量级锁是没必要的。因此VM引入了轻量级锁的概念。
就是我这个东西 一个线程执行 先获取锁、调用的方法还有一把锁、它们是相同的锁,它们不会发生竞争;但是如果外面还有线程也调用这个方法 就会产生竞争

同一个线程中的代码块不存在竞争、没必要用重量级锁(Monitor)、

偏向锁
只做一次CAS操作、把线程id记录、biased_lock设置1;后续不做CAS操作、只比对线程id即可;

小结:

谈谈JMM(java内存模型)


知道CAS吗
CSA:保证线程在无锁状态下对共享变量操作的原子性

就是自旋重置、它没有涉及到任何锁 也能保证原子性 主要还是通过自旋不断的判断 底层是基于unsafe;

谈谈volatile
用volatile修饰共享变量,能够防止编译器等优化发生,让一个线程对共享变量的修改对另一个线程可见;(针对JIT自动优化的情况;其余简单情况、不加volatile、比如这里线程2也能读到stop=true)


指令重排序问题:

简单说就是JVM为了对代码进行优化提高性能会在不影响结果的情况下把代码执行顺序改变,但多线程就可能会出现结果不对的问题;

volatile使用技巧:
.写变量让volatile修饰的变量的在代码最后位置
.读变量让volatile修饰的变量的在代码最开始位置
小结:

什么是AQS


多个线程共同去抢这个资源是如何保证原子性的呢?
CAS保证原子性;CSA:保证线程在无锁状态下对共享变量操作的原子性
AQS是公平锁吗,还是非公平锁?
可实现公平锁也可实现非公平锁;

小结:

ReentrantLock的实现原理


