如何查看线程死锁 可以通过jstack命令来进行查看,jstack命令中会显示发生了死锁的线程 或者两个线程去操作数据库时,数据库实例发生了死锁,这是可以查询数据库的死锁情况 -- 1、查询是否锁表
show OPEN TABLES where In_use > 0;
-- 2、查询进程
show processlist;
-- 3、查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-- 4、查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
线程间如何进行通讯的 线程之间可以通过共享内存或基于网络来进行通信 如果是通过共享内存来进行通信,则需要考虑并发的问题,什么时候阻塞,什么时候唤醒 像Java中的wait()、notify()就是阻塞和唤醒 通过网络就比较简单了,通过网络连接将通信数据发送给对方,当然也要考虑到并发问题,处理方式就是加锁等方式。 介绍一下Spring,读过源码介绍一下大致的流程 Spring是一个快速开发框架,Spring帮助程序员来管理对象 Spring的源码实现是非常优秀的,设计模式的应用,并发安全的实现、面向接口的设计等等 在创建Spring容器,也就是启动Spring时首先会进行扫描,扫描得到的所有BeanDefinition对象,并存在一个Map中 然后筛选出非懒加载的单例BeanDeafinition进行创建Bean,对于多例Bean不需要再启动过程中去进行创建,对于多例Bean会在每次获取Bean时利用BeanDefinition去创建 利用BeanDefinition创建Bean就是Bean的创建生命周期,这期间包括了合并BeanDefinition、推断构造函数、实例化、属性填充、初始化前、初始化、初始化后等步骤,其中AOP就是发生在初始化后这一步骤中 单例Bean创建完之后,Spring会发布一个容器启动事件 Spring启动结束 在源码中会更复杂,比如源码中会提供一些模板方法,让子类实现,比如源码中还涉及到一些BeanFactoryPostProcessor和BeanPostProcessor的注册,Spring地扫描就是通过BeanFactoryPostProcessor来实现地,依赖注入就是通过BeanPostProcessor来实现的 在Spring启动过程中还会去处理@Import等注解 image.png
说一下Spring的事务机制 Spring事务底层是基于数据库事务和AOP机制的 首先对于使用了@Transaction注解的Bean,Spring会创建一个代理对象Bean 当调用代理对象的方法时,会先判断该方法上是否加了@Transaction注解 如果加了,那么则利用事务管理器创建一个数据库连接 并且修改数据库连接的autocommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步 然后执行当前方法,方法中会执行sql 执行完当前方法后,如果没有出现异常就提交事务 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务 Spring事务的隔离级别对应的就是数据库的隔离级别 Spring事务的传播机制时Spring事务自己实现的,也是Spring事务中最复杂的 Spring事务的传播机制是基于数据库连接来做的,一个数据连接是一个事务,如果传播机制配置为需要新开一个事务,那么实际上就是先建立一个数据库连接,在此新数据库连接上执行sql image.png
什么时候@Transactional失效 因为Spring事务是基于代理来实现的,所以某个加了@Transactional的方法只有是被代理对象调用时,那么这个注解才会生效,所以如果是被代理对象来调用这个方法,那么@Transactional是不会生效的。
同时如果某个方法是private的,那么@Transactional也会失效,因为底层cglib是基于父子类来实现的,子类是不能重载父类的private方法的,所以无法很好的利用代理,也会导致@Transactianal失效
具体情况可参考之前的文章:
Spring事务失效的12种场景总结
Dubbo是如何做系统交互的 Dubbo底层是通过RPC来完成服务和服务之间的调用的,Dubbo支持很多协议,比如默认的dubbo协议,比如http协议、比如rest等都是支持的,他们的底层所使用的技术是不太一样的,比如dubbo协议底层使用的是netty,也可以使用mina,http协议底层使用的tomcat或jetty。
服务消费者在调用某个服务时,会将当前所调用的服务接口信息、当前方法信息、执行方法所传入的入参信息等组装为一个Invocation对象,然后不同的协议通过不同的数据组织方式和传输方式将这个对象传送给服务提供者,提供者接收到这个对象后,找到对应的服务实现,利用反射执行对应的方法,得到方法结果后再通过网络响应给服务消费者。
当然,Dubbo在这个调用过程中还做很多其他的设计,比如服务容错、负载均衡、Filter机制、动态路由机制等等,让Dubbo能处理更多企业中的需求。
image.png
image.png
Dubbo的负载均衡策略 Dubbo目前支持:
平衡加权轮询算法 加权随机算法 一致性哈希算法 最小活跃数算法