1.什么叫线程池吗?
所谓的线程池指的就是一组线程对象被统一的一个外部对象包装(池对象),而后在这个池里面就可以利用这些线程对象一起完成更高效的程序开发,也就是所有的任务的执行都是
采用了并发执行的模式完成。而JDK 1.5之后提供有java.util.concurrent开发包,这个开发包就是负责并发执行的操作开发包。
2.spring代理机制
JDK自带实现方法 和 用CGLIB包实现 区别和优缺点
区别:JDK需要接口,CGLIB不需要接口,Java中的动态代理设计需要以接口为操作依据,需要实现InvocationHandler接口;而使用CGLIB可以利用共同的父类来实现动态代理设计模
式。
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中
方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
3.怎么实现本地远程调用(RPC)?
WEBSERVICE,RMI、MINA、ESB、 Burlap、Hessian、SOAP、EJB和JMS 等
4.手写复杂SQL语句
见ORACLE笔记,就不告诉你第几页
5.AOP做事务控制
老李说,我们就拿它弄个事务控制
Spring的面向切面编程(AOP)底层实现原理是动态代理
基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。
声明式事务管理又有两种方式:一种是基于XML配置文件的方式;另一种是在业务方法上添加@Transactional注解,将事务规则应用到业务逻辑中(一般定义在service层)。
6.事务的传播性和隔离性?
一、事务的四个特性
原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全不做。
一致性:数据不会因为事务的执行而遭到破坏。
隔离性:一个事务的执行,不受其他事务(进程)的干扰。既并发执行的个事务之间互不干扰。
持久性:一个事务一旦提交,它对数据库的改变将是永久的。
事务具有7个传播级别和4个隔离级别,传播级别定义的是事务创建的时机,隔离级别定义的是对并发事务数据读取的控制。
http://blog.csdn.net/yang1982_0907/article/details/44408809
7.消息中间件
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程
间的通信。
kafka,activeMQ
消息中间件为应用系统提供高效、灵活的消息同步和异步传输处理、存储转发、可靠传输。在大规模分布式环境下确保消息安全、可靠、高效送达。
特点:
1.分布式环境下,可靠、高效的消息传输
产品容错能力强,系统崩溃时不会导致消息丢失,确保关键业务数据的可靠传输;支持断点续传和消息流量控制,使消息引擎能够最大效率地利用网络传输能力。
2.多种集群方式,稳定高效
InforSuite MQ的若干节点可以组建为多种方式的群组,对外提供消息接收和处理功能。当单个节点无法满足大负载的消息处理要求,可以使用集群功能将负载分配到多个节点上,提高系统的
处理能力和可扩展性。
3.全方位的安全机制保障
产品提供多层次的安全管理功能,包括连接建立时的网络认证,消息传输时的安全性保证,有效保证了连接的合法性和私有数据的保密性。
一般都是银行类大系统,军工或者研究所的大项目,存在很多数据传输的时候需要,可以咨询国内的一些基础中间件公司,就那么几家,中创中间件、东方通中间件、金蝶等,可以多了解
8.负载均衡
在互联网高速发展的时代,大数据量、高并发等是互联网网站提及最多的。如何处理高并发带来的系统性能问题,最终大家都会使用负载均衡机制。它是根据某种负载策略把请求分发到集群
中的每一台服务器上,让整个服务器群来处理网站的请求。
负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性;
nginx , HA
https://my.oschina.net/bigdataer/blog/486770
9.缓存
所谓的缓存从广义上来讲:提升数据的查询性能。通过整个的计算机的结构来讲,CPU所需要的数据通过内存取得,而内存的数据可以通过磁盘加载完成。但是在整个的项目的开发环节过程之
中会出现一种可怕的问题:就是说计算机可能很忙碌,一个进程需要进行磁盘文件的读取,需要1S的时间,但是如果说现在有20W个进程同时需要进行数据的读取过程,那么这个过程就有可能
造成计算机的假死状态。所以现在的开发基本上需要解决最大的问就在于:内存和磁盘之间的数据读取效率问题。 所以这个时候发现程序效率最大的问题都来自于磁盘。
缓存一般分为两种:一级缓存(单个用户、SqlSession)、二级缓存(所有用户、SqlSessionFactory)。 当你使用了缓存的话,就意味着你丧失了自动数据同步的功能支持。也就是说在内
存中的数据与数据表中的数据可能不一致。
10.mysql索引 :
MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等
联合索引和B树索引 :
如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找。
联合索引:
一般情况下是对表的单列数据建立索引,对于多列(id和name组合,或者,name和id组合),也可以建立索引。联合索引,也称之为组合索引。
创建时一并创建联合索引
create table test(
a int,
b int,
c int,
KEY a(a,b,c)
);
往已创建的数据表追加联合索引
alter table users add index lname_fname_age(lname,fname,age);
http://www.cnblogs.com/gudi/archive/2014/10/29/4058411.html
联合索引与单列索引的区别:联合索引的查询性能好于多个单列索引的查询性能
B树索引:
B 树在数据库中的应用
{
为什么使用B 树?言简意赅,就是因为:
1.文件很大,不可能全部存储在内存中,故要存储到磁盘上
2.索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/ Tree,还跟磁盘存取原理有关。)
3.局部性原理与磁盘预读,预读的长度一般为页(page)的整倍数,(在许多操作系统中,页得大小通常为4k)
4.数据库系统巧妙利用了磁盘预读原理,将一
创建索引的原则
索引就是为了提高查询性能,如果要对数据库进行频繁做DML操作,反而会降低性能
11.HashMap 源码解读
HashMap多线程并发
HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap。HashMap是非线程安全的,多个线程put的时候造成了某个key值Entry key List的死循环,建议在这样的场景下应采用"ConcurrentHashMap".注意:不合理使用HashMap导致出现的是死循环而不是死锁。
HashMap与ConcurrentHashMap的区别 如何解决Hash冲突
支持检索的完全并发和更新的所期望可调整并发的哈希表。
分析Hashtable知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。
http://www.cnblogs.com/ITtangtang/p/3948786.html
12.java内存模型的划分
GC过程 原理 什么时候发生GC? GC期做了什么?
内存模型划分:几块,程序计数器流程,本地方法区,Java堆
什么时候出发Full GC
Java内存管理图(背)
13.网络状态码 204,302,502
100-199 用于指定客户端应相应的某些动作。 200-299 用于表示请求成功。 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 400-499 用于指出客户端的错误。 500-599 用于支持服务器错误。
204 (No Content/无内容) 在并没有新文档的情况下,204 (SC_NO_CONTENT)确保浏览器继续显示先前的文档。这各状态码对于用户周期性的重载某一页非常有用,并且你可以确定先前的页面是否已经更新。
302 (Found/找到) 与301有些类似,只是定位头信息中所给的URL应被理解为临时交换地址而不是永久的。注意:在 HTTP 1.0中,消息是临时移动(Moved Temporarily)的而不是被找到,因此HttpServletResponse中的常量是SC_MOVED_TEMPORARILY不是我们以为的SC_FOUND。
出现502的原因是:对用户访问请求的响应超时造成的
14.单例模型(会手写)
两种模式 懒汉和饿汉 饿汉模式是线程安全
为什么是线程安全? 出现不安全情况怎么处理?
15.复杂SQL(会手写)
16.快速排序,二叉树 自己百度去
17.RPC
远程过程调用协议