32.两个进程能否共享内存空间
35.开启多个线程,如何保证顺序执行,有哪几种实现方式,或者如何保证多个线程都执行完再拿到结果
36、延迟队列的实现方式,delayQueue 和时间轮算法的异同
37、非常多个线程(可能是不同机器)相互之间需要等待协调,才能完成某种工作,问怎么设计这种协调方案
39、什么是锁升级降级
43、线程常用的并发类及关键字
不安全的,因为在操作i++的时候,是分步骤做的,可以理解为: tp = i; tp2 = i+1; i=tp2; 如果线程1在执行第一条代码的时候,线程2访问i变量,这个时候,i的值还没有变化,还是原来的值,所以是不安全的 这也是经典的内存不可见问题,那么把 i加上 volatile 让内存可见是否能解决这个问题呢? 答案是:不 能。因为 volatile 只能保证可见性,不能保证原子性。多个线程同时读取这个共享变量的值,就算保证其他线 程修改的可见性,也不能保证线程之间读取到同样的值然后相互覆盖对方的值的情况。
46、说说 JDK1.6 之后的synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗
JDK1.6 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。
锁主要存在四中状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,他们会随着竞争的激烈而逐渐升级。注意锁可以升级不可降级,这种策略是为了提高获得锁和释放锁的效率。
关于这几种优化的详细信息可以查看:synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比
jdk1.7源码
HashMap结构中,是允许保存
null
的,Entry.key
和Entry.value
均可以为null
。但是HashTable中是不允许保存null
的HashTable类继承自
Dictionary
类,实现了三个接口,分别是Map
,Cloneable
和java.io.Serializable
HashTable的主要方法的源码实现逻辑,与HashMap中非常相似,有一点重大区别就是所有的操作都是通过
synchronized
锁保护的。只有获得了对应的锁,才能进行后续的读写等操作。
LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法操作上又与 HashSet 相同
LinkedList存储元素的数据结构是双向链表结构,由存储元素的结点连接而成,每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可。
开源框架与技术
tomcat
- 简单讲讲 tomcat结构
- tomcat启动流程
- tomcat怎么处理请求,流程是怎样的
- tomcat如何调优
- maxThreads、maxConnections、acceptAccount区别
- tomcat默认支持并发数,怎么修改?
- tomcatNIO线程模型
spring
4.Springmvc中DispatcherServlet初始化过程
5.Bean如何优雅的销毁
context.registerShutdownHook(); 是一个钩子方法,当jvm关闭退出的时候会调用这个钩子方法,在设计模式之 模板模式中 通过在抽象类中定义这样的钩子方法由实现类进行实现,这里的实现类是AbstractApplicationContext,这是spring 容器优雅关闭的方法
Spring 的 init-method 和 destory-method_安德里亚的成长-CSDN博客_init-method=
7.什么是IOC
核心概念
1、切面( aspect) : 类是对物体特征的抽象,切面就是对横切关注点的抽象
2、横切关注点: 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。
3、连接点( joinpoint) : 被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
4、切入点( pointcut) : 对连接点进行拦截的定义
5、通知( advice) : 所谓通知指的就是指拦截到连接点之后要执行的代码, 通知分为前置、后置、异常、最终、环绕通知五类。
6、目标对象: 代理的目标对象
7、织入( weave) : 将切面应用到目标对象并导致代理对象创建的过程
Spring 提供了两种方式来生成代理对象: JDKProxy 和 Cglib,具体使用哪种方式生成由
AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。 默认的策略是如果目标类是接口,
则使用 JDK 动态代理技术,否则使用 Cglib 来生成代理。
10.BeanFactory和ApplicationContext区别
15.Spring怎么配置事务(具体说出一些关键的xml元素)
18.Spring循环依赖的处理(单例、多例状态下的处理,懒加载一定能处理掉循环依赖么?)
19.@Autowired 与@Resource和@Qualifier注解的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了
@Autowired是根据类型进行自动装配的。如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题
可能存在多个UserDao实例
@Autowired
public void setUserDao(@Qualifier("userDao") UserDao userDao) {
this.userDao = userDao;
}
20.@transactional注解在什么情况下会失效,为什么
1、service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。
2、@Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。
3、默认情况下,Spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。 通俗一点:你写代码出现的空指针等异常,会被回滚,文件读写,网络出问题,spring就没法回滚了
netty
1.netty的线程模型是什么?netty是如何基于reactor模型上实现的
2.netty的HashedWheelTimer 的用法,实现原理,是否出现过调用不够准时,怎么解决
https://blog.csdn.net/u013252773/article/category/2104567
5.netty原理
dubbo
Dubbo的 protocol标签提供了三个参数 dispatcher,threads(默认为100) 和 threadpool来为我们自定义DUBBO协议下的线程模型
Dubbo的线程模型_击水三千里的专栏-CSDN博客_dubbo 线程模型
dubbo提供了三种结果缓存机制: lru:基于最近最少使用原则删除多余缓存,保持最热的数据被缓存 threadlocal:当前线程缓存 jcache:可以桥接各种缓存实现 使用方式 <dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService"> <dubbo:method name="sayHello" timeout="60000" cache="lru"/> </dubbo:reference>
第1种 在远程调用异常时,服务端直接返回一个固定的字符串(也就是写死的字符串) 具体配置: 在服务调用方配置mock参数: <dubbo:reference id="xxxService" interface="com.x..service.xxxxService" check="false" mock="return 123456..." /> 说明:配置了mock参数之后,假设在调用服务的时候,远程服务没有启动,或者各种网络异常了,那远程服务 会把这个mock配置的值返回,也就是会返回123456... 第2种 在远程调用异常时,服务端根据自定义mock业务处理类进行返回) 具体配置: 在服务调用方配置mock参数: <dubbo:reference id="xxxService" interface="com.x..service.xxxxService" check="false" mock="true" /> 说明:配置了mock参数之后,假设在调用服务的时候,远程服务没有启动,或者各种网络异常了,那远程服务 会去寻找自定义的mock业务处理类进行业务处理。 因此还需配置一个自定义mock业务处理类 在接口服务xxxxService的目录下创建相应的mock业务处理类,同时实现业务接口xxxxService(),接口名要 注意命名规范:接口名+Mock后缀,mock实现需要保证有无参的构造方法。 public class xxxxServiceMock implements xxxxService { @Override public String getXXXX(int id) { return "this is exception 自定义...."; } }
对于通过dubbo Main方式启动dubbo容器的,只需在启动前添加java环境变量-Ddubbo.shutdown.hook=true即 可。 对于tomcat等web容器方式启动dubbo的,需要在关闭时执行方法ProtocolConfig.destroyAll(); kill -9 默认对于dubbo Main方式启动的,优雅停机不生效
dubbo 内部有几种线程模型,都是使用 java 线程池实现的,任务被拒绝后会输出堆栈信息。我们可以看它是怎 么实现的
Dubbo 源码分析之自定义线程池拒绝策略(使用 Java 程序 Dump 线程堆栈信息)_苏苏爱自由-CSDN博客
1dubbo协议 Dubbo缺省协议采用单一长连接和NIO异步通讯,使用基于于netty+hessian(序列化方式)交互。适合于小数据 量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。Dubbo缺省协议不适合传送大数据 量的服务,比如传文件,传视频等,除非请求量很低。 2 rmi协议 走java二进制序列化,多个短连接,适合消费者和提供者数量差不多,适用于文件的传输,一般较少用,在大数据 量下的传输性,建议使用rmi协议 3 hessian协议 走hessian序列化协议,多个短连接,适用于提供者数量比消费者数量还多,适用于文件的传输,一般较少用 4 http协议 走json序列化 5 webservice
14.dubbo的优缺点是什么
17.dubbo遇到那些坑
18.Dubbo运行时,突然所有的zookeeper全部宕机,Dubbo是否还会继续提供服务
可以,因为刚开始初始化的时候,消费者会将提供者的地址等信息拉取到本地缓存,所以注册中心挂了可以继续通信
19.Dubbo源码
<dubbo:registry address="redis://127.0.0.1:6379" username="admin" password="password"></dubbo:registry> <dubbo:protocol name="dubbo" port="20880" />
22.Dubbo最佳实践
23.Dubbo调优经验
zookeeper
Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。
一、basic paxos流程(推荐别人,超过半数投票机制) 1 .选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server; 2 .选举线程首先向所有Server发起一次询问(包括自己); 3 .选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存 储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记 录表中; 4. 收到所有Server回复以后,就计算Server中zxid最大的那个Server,并将这个Server相关信 息设置成下一次要投票的Server; 5. 线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1 的Server票数, 设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否 则,继续这个过程,直到leader被选举出来。 二、fast paxos流程(推荐自己,全票机制) 在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch 和zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出 Leader
3.zookeeper原理
Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。
为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。
epoch:可以理解为当前集群所处的年代或者周期,每个 leader 就像皇帝,都有自己的年号,所以每次改朝换代, leader 变更之后,都会在前一个年代的基础上加 1。这样就算旧的 leader 崩溃恢复之后,也没有人听他的了,因为 follower 只听从当前年代的 leader 的命令。
每个Server在工作过程中有三种状态:
LOOKING:当前Server不知道leader是谁,正在搜寻
LEADING:当前Server即为选举出来的leader
FOLLOWING:leader已经选举出来,当前Server与之同步
把follower的数据同步给leader的过程: 1. leader等待server连接; 2.Follower连接leader,将最大的zxid发送给leader; 3.Leader根据follower的zxid确定同步点; 4.完成同步后通知follower 已经成为uptodate状态; 5.Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。
1 .恢复数据; 2 .维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型; 3 .Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理
1. 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息); 2 .接收Leader消息并进行处理; 3 .接收Client的请求,如果为写请求,发送给Leader进行投票; 4 .返回Client结果。
10.什么是zab协议
ZAB(ZooKeeper Atomic Broadcast)协议是为协调分布式服务,ZooKeeper专门设计的一种支持漰溃恢复的原子 广播协议。 ZAB协议的两种基本模式:崩溃恢复模式和消息广播模式。
(1)配置管理 (2)集群管理
12.为什么zookeeper不用paxos,而是用的zab算法
ZK的每一个操作都具有隐形事务要求,通过强一致性保证数据节点的数据的顺序性(FIFO)。Paxos协议无法实现多个写操作的顺序性,或者通过串行操作实现,则以牺牲效率为代价。
mybatis
1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。