JAVA面试

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的实现原理

JAVA基础

相关推荐
jiayou642 小时前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
于眠牧北3 小时前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤1 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12022 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区2 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再3 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip