1、JUC
可重入锁【可重入锁又名递归锁】:
LockSupport:
2、spring主流面试方向:IOC、AOP、TX
spring的AOP的顺序
spring的循环依赖
Aop常用注解: @Before 前置通知:目标方法之前执行、
@After 后置通知:目标方法之后执行、
@AfterReturning 返回后置通知、
@AfterThrowing 异常通知、
@Around 环绕通知:环绕目标方法执行
3、Spring、SpringMVC和SpringBoot之间的区别
6、spring核心之一:控制反转(IOC)和依赖注入(DI)
9、MySQL中InnoDB和MyISAM对比:
·事务:InnoDB支持事务,InnoDB支持行级锁
·锁:MyISAM不支持事务,MyISAM支持表级锁
·存储:
InnoDB,基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件 的大小,它的索引文件和数据是存放到一起的,MyISAM是分开存储的。
MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型, .frm文件存 储表定义,数据文件的扩展名为.MYD, 索引文件的扩展名是.MYI。
·索引:
InnoDB(索引组织表)使用的聚簇索引、索引就是数据,顺序存储,因此能缓存索引,也能缓存数据
MyISAM(堆组织表)使用的是非聚簇索引、索引和文件分开,随机存储,只能缓存索引
·场景选择:
InnoDB
需要事务支持(具有较好的事务特性)
行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成
数据更新较为频繁的场景
数据一致性要求较高
硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO
MyISAM
不需要事务支持(不支持)
并发相对较低(锁定机制问题)
数据修改相对较少(阻塞问题),以读为主
数据一致性要求不是非常高
一、JAVA如何开启线程?怎么保证线程安全?
线程和进程的区别:进程是操作系统进行资源分配的最小单元。线程是操作系统进行任务分配的最小单元,线程隶属于进程。
如何开启线程?1、继承Thread类,重写run方法。2、实现Runnable接口,实现run方法。3、实现Callable接口,实现call方法。通过FutureTask创建一个线程,获取到线程执行的返回值。4、通过线程池来开启线程。
怎么保证线程安全?加锁:1、JVM提供的锁,也就是Synchronized关键字。2、JDK提供的各种锁Lock。
二、Volatile和Synchronized有什么区别?Volatile能不能保证线程安全?DCI(Double Check Lock)单例为什么要加Volatile?
1、Synchronized关键字,用来加锁。Volatile只是保持变量的线程可见性。通常适用于一个线程写,多个线程读的场景
2、不能。Volatile关键字只能保证线程可见性,不能保证原子性。
3、Volatile防止指令重排。在DCL中,防止高并发情况下,指令重排造成的线程安全问题。
三、JAVA线程锁机制是怎么样的?偏向锁、轻量级锁、重量级锁有什么区别?锁机制是如何升级的?
1、Java的锁就是在对象的Mark Word中记录一个锁状态。无锁、偏向锁、轻量级锁,重量级锁对应不同的锁状态。
2、Java的锁机制就是根据资源竞争的激烈程度不断进行锁升级的过程。