给大脑的知识建立索引,基于索引去定位你的知识:
1、它是什么?
2、它能解决什么问题
3、它有哪些优点和特征
4、为什么能解决这类问题
1、Sping中事务的传播行为有哪些?(2年工作经验)
@Transactional(propagation = Propagation.REQUIRED)
REQUIRED(默认):支持当前事务,如果不存在,就新建一个事务
REQUIRES_NEW:如果有事务存在,挂起当前事务,创建一个新事务
NESTED:如果当前存在事务,则嵌套事务执行,不存在就创建一个新事务
SUPPORTS:支持当前事务,如果不存在,就不使用事务
NOT_SUPPOTED:以非事务方式运行,如果有事务存在,挂起当前事务
MANDATORY:支持当前事务,如果不存在,抛出异常
NEVER: 以非事务方式运行,如果有事务,抛出异常
2、谈谈你对线程安全的理解?(4年工作经验)
简单来说,在多个线程去访问某个方法或者对象的时候,不管通过任何的方式的调用或者线程如何去交替执行,在程序中不做任何同步干预的情况下,这个方案或者对象的执行或者修改都能够按照预期的结果来反馈,那么这个类我们认为它是线程安全的。
实际上线程安全问题的具体表现有三个方面:原子性、有序性、可见性。
原子性:一个线程执行的一系列程序指令操作的时候,它应该是不可中断的,因为一旦出现中断,站在多线程的角度来看,这一系列的程序指令出现前后执行结果不一致的一些问题,那么这个和数据库里面的原子性是一样的,简单理解就是说一段程序只能有一个线程完整的执行完成,而不能存在多个线程的一个干扰,CPU的上下文切换是导致原子性问题的一个核心,而JVM里面提供了一个Synchronized来去解决这样一个原子性问题
可见性:在多线程环境下,由于读和写是发生在不通的线程里面的,有可能会出现某个线程对共享变量的修改对其他线程不是实时可见的,导致可见性问题的原因有很多,比如像CPU的高速缓存、CPU的指令重排序、编译器的指令重排序
有序性:说的是程序编写的指令顺序,和最终CPU运行的指令顺序,可能会出现不一致的这样一个现象,这种现象我们可以称为指令重排序,所以有序性它也会导致可见性的这样一个问题,可见性和有序性我们可以通过JVM里面提供的Volatile关键字来解决
最后:在我看来,导致有序性、原子性、可见性问题的一个本质是计算机工程师为了最大化的提升CPU利用率导致的,比如说为了提升CPU的利用率设计了三级缓存、设计了StoreBuffer、设计了缓存行的这种预读机制,在操作系统里面设计了线程模型,在编译器里面设计的编译器的深度优化机制
3、CPU突然飙高系统反应慢怎么排查? #场景类问题 #阿里
4个方面:
导致CPU飙高原因:
1、上下文切换
文件IO
网络IO
锁等待
线程阻塞:
4、死锁的发生原因和怎么避免?