JAVA高级工程师面试宝典——线程、设计模式、缓存方面(二)

二、线程、设计模式、缓存方面

1.SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢

答:该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题,因为 DateFormat 和 SimpleDateFormat 类不都是线程安全的,在多线程环境下调用 format() 和 parse() 方法应该使用同步代码来避免问题。

 

 

2.如何看待设计模式,并简单说说你对观察者模式的理解

答:用途:(1) 设计模式来源众多专家的经验和智慧;(2) 设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间沟通和交流,使得设计方案更加通俗易懂。(3) 大部分设计模式都兼顾了系统的可重用性和可扩展性; (4) 合理使用设计模式并对设计模式的使用情况进行文档化,将有助于别人更快地理解系统;(5) 最后一点对初学者很重要,学习设计模式将有助于初学者更加深入地理解面向对象思想。

有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

 

 

3.集群环境中,session如何实现共享

答:1. 客户端cookie加密2. application server的session复制3. 使用数据库保存session4. 使用共享存储来保存session5. 使用memcached来保存session6. 使用terracotta来保存session

 

 

4.分布式、集群环境中,缓存如何刷新,如何保持同步?

答:

A、缓存如何刷新? 1、定时刷新  2、主动刷新覆盖   ,每个缓存框架都有自带的刷新机制,或者说缓存失效机制,就拿Redis和 Ehcache举例, 他们都有自带的过期机制,另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖即可

B、缓存如何保持同步?  这个redis有自带的集群同步机制,即复制功能,具体参考:基于Redis分布式缓存实现      ,Ehcache也有分布式缓存同步的配置,只需要配置不同服务器地址即可,参照:Ehcache分布式缓存同步

 

 

5.一条sql执行过长的时间,你如何优化,从哪些方面?

答:

1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)

2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合

3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度

4、针对数量大的表进行历史表分离(如交易流水表)

5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步

6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等

7、查看mysql执行日志,看看是否有其他方面的问题

个人理解:从根本上来说,查询慢是占用mysql内存比较多,那么可以从这方面去酌手考虑

 

 

6.Redis实现消息队列

答:一般来说,消息队列有两种模式,一种是发布者订阅模式,另外一种是生产者和消费者模式。Redis的消息队列,也是基于这2种原理的实现。

发布者和订阅者模式:发布者发送消息到队列,每个订阅者都能收到一样的消息。

生产者和消费者模式:生产者将消息放入队列,多个消费者共同监听,谁先抢到资源,谁就从队列中取走消息去处理。注意,每个消息只能最多被一个消费者接收。

 

 

------------------------------------------------------------------------------

上一篇:JAVA高级工程师面试宝典——基础部分(一)

下一篇:JAVA高级工程师面试宝典——框架方面问题(三)

------------------------------------------------------------------------------

你可能感兴趣的:(高级JAVA工程师面试宝典)