面试题系列

一:怎么避免死锁

加锁顺序(线程按照一定的顺序加锁)

加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)

死锁检测

二:@Translate事务底层实现

//事务传播属性

@Transactional(propagation=Propagation.REQUIRED)//如果有事务,那么加入事务,没有的话新创建一个

@Transactional(propagation=Propagation.NOT_SUPPORTED)//这个方法不开启事务

@Transactional(propagation=Propagation.REQUIREDS_NEW)//不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务

@Transactional(propagation=Propagation.MANDATORY)//必须在一个已有的事务中执行,否则抛出异常

@Transactional(propagation=Propagation.NEVER)//不能在一个事务中执行,就是当前必须没有事务,否则抛出异常

@Transactional(propagation=Propagation.SUPPORTS)//其他bean调用这个方法,如果在其他bean中声明了事务,就是用事务。没有声明,就不用事务。

@Transactional(propagation=Propagation.NESTED)//如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动的事务,则按照REQUIRED属性执行,它使用一个单独的事务。这个书屋拥有多个回滚的保存点,内部事务的回滚不会对外部事务造成影响,它只对DataSource TransactionManager事务管理器起效。

@Transactional(propagation=Propagation.REQUIRED,readOnly=true)//只读,不能更新,删除

@Transactional(propagation=Propagation.REQUIRED,timeout=30)//超时30秒

三:redis的数据淘汰策略

volatile-lru:从已设置过期的数据集中挑选最近最少使用的淘汰

volatile-ttl:从已设置过期的数据集中挑选将要过期的数据淘汰

volatile-random:从已设置过期的数据集中任意挑选数据淘汰

allkeys-lru:从数据集中挑选最近最少使用的数据淘汰

allkeys-random:从数据集中任意挑选数据淘汰

noenviction:禁止淘汰数据

四:synchronized和lock使用上的区别

Lock是一个接口,而synchronized是关键字。

synchronized会自动释放锁,而Lock必须手动释放锁。

Lock可以让等待锁的线程响应中断,而synchronized不会,线程会一直等待下去。

通过Lock可以知道线程有没有拿到锁,而synchronized不能。

Lock能提高多个线程读操作的效率。

synchronized能锁住类、方法和代码块,而Lock是块范围内的

五:JVM中堆、栈存储的是什么?

堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用;

方法区:

 1 字符串常量

 2 static

 3 所有的class

 a) 被所有线程共享, 其内存放程序中永远唯一的元素,eg: static class

六:dubbo和SpringCloud的区别

七:Rest和RPC对比

RPC最主要的缺陷就是服务提供方和调用方式之间依赖太强,我们需要为每一个微服务进行接口的定义,并通过持续继承发布,需要严格的版本控制才不会出现服务提供和调用之间因为版本不同而产生的冲突

而REST是轻量级的接口,服务的提供和调用不存在代码之间的耦合,只是通过一个约定进行规范,但也有可能出现文档和接口不一致而导致的服务集成问题,但可以通过swagger工具整合,是代码和文档一体化解决,所以REST在分布式环境下比RPC更加灵活

这也是为什么当当网的DubboX在对Dubbo的增强中增加了对REST的支持的原因

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容