进程和线程的区别
1、线程是操作系统调度的最小单元,它可以让一个进程并发的处理多个任务,也叫轻量级进程
2、进程拥有自己的独立地址空间。线程没有,但有自己的堆栈和局部变量
3、进程和线程进行上下文切换时,进程的上下文切换要比线程的上下文切换更加的久,且资源利用也更多。
4、当一个进程崩溃的时候,在保护模式下,其他进程可以继续运行,而当线程崩溃的时候,进程也会随之崩溃。所以多线程要比多进程更加健壮。
5、每一个进程都拥有一个程序运行的入口,顺序执行序列和程序运行的出口,但线程不能独立执行,他需要依附于应用程序的执行,由应用程序提供多线程执行。
6、进程的并发性低,线程的并发性高。
7、系统在运行的过程中会给每个进程分配不同的内存空间;而对于线程而言,除了cpu外,系统不会为现场分配内存,线程只能资源共享。
mysql索引:
1、索引好像指向表头的指针,是一种循序查询操作来快速确定WHERE的方式。
2、索引毫无疑问的加快了搜索速度,但也会增加存储资源的小号,同时也加大了插入,更新等操作的成本。
3、有了索引也可以不走索引,只要不遵循“最左前缀”的原则进行搜索,即可不进行索引来查询。
怎样保证线程安全
三种方式,juc原子操作,volatile,锁
1、在juc包中,可以通过一种原子操作类提供了一种用法简单、性能高效、线程安全的定义变量的方式,无论那种原子类都要遵循“比较和替换”的设定,每次更新操作的时候都要确定值是否处于预期,如果处于预期则再更新,否则将失效。
2、volatile是一种轻量级的synchronized
3、对于锁,拥有两种情况,一种是syzeide 另一种是lock
由于在syz是早期的api所以并没有考虑到响应中断,超时扩展等功能,并且由于如果要在使用的过程中增加这一功能的话,需要花费很大的时间来完成,所以在1.5版本增加了lock接口,以保证响应中断,支持超市等功能的实现。
死锁的定义及条件
1、定义:对于死锁,当两个或两个以上的线程争夺共享资源,而造成的等待状况,如果没有外力的帮助,就会一直保持等待状态,这样的状态被称为死锁。
2、要产生死锁,也需要满足一定条件,如不剥夺条件,环路等待条件,互斥条件,请求和保持条件。
进程的通信方式
管道、命名管道、消息队列、信号、共享内存、内存映射、信号量、socket
对于MVC的理解
MVC分为三层模式,
model层:来完成数据与数据间的交流
view层:呈现在用户眼中的界面
controller层:将用户提交的数据发送给model层,以及将model层处理完的数据发送给view层。
对于服务器端的开发,采用jsp和servlet和javabean模式来进行操作。
redis的数据类型
redis的主要五种数据类型:string、hash、list、set、zset
并且还有其他数据类型:bitmap、hyperloglog、Geo,并且在5.0版本的时候新增加了Streams数据类型,他是一个功能强大的,支持多播的,可持久话的消息队列
乐观锁和悲观锁
1、乐观锁总是假设最好的状态,每次去拿数据的时候默认别人不会修改数据,所以不会上锁,只有在更新的时候才会判断一下是否有人更新了这个数据,适用于多读,可以使用版本号,来控制。
2、悲观锁总是假设最坏的情况,每次去拿数据的时候默认别人会修改,所以每次拿数据都会上锁,这样别人想拿到这个数据时会阻塞直到拿到锁。
redis的持久化操作
1、redis的持久化操作分为rdb持久化,aof持久化,以及混合持久化。
2、rdb持久化:将当前进程的数据以生成快照的方式,保存到磁盘中,也是默认的持久化操作,生成一个压缩的后缀为.Rdb的文件,内部存储了所有的键值对信息。
3、aof持久化操作:以独立日志的格式存储了每次写入的命令,重启时在执行aof文件中的命令来恢复数据。其解决了数据持久化的实时性,是目前主流的持久化操作方式,
4、而二者结合的方式,混合持久化是redis4.0引入的,这种方式用户可以同时获得RDB持久化与AOF持久化的优点,不但可以将aof文件中的rdb数据快速恢复数据,也可以将aof文件中的aof数据来将丢失数据限制在15s内。
AOP的理解
aop是面向切面编程,是对oop的一种补充,它可以对业务逻辑进行各个部分进行隔离,降低耦合,提高代码的可重用性,他的底层是通过动态代理实现的,他的应用场景有事务,日志管理等。
aop以动态代理的方式来减低代码的耦合度,而动态代理,分为jdk动态代理,以及cglib动态代理
虚拟内存与物理内存
物理内存就是计算机真实拥有的内存,物理内存是有限的,容易产生内存不足的问题。
而虚拟内存是一种抽象的逻辑概念,拥有连续的内存地址。
IOC控制反转
IOC:控制反转 控制:对象的创建与销毁 反转:将对象的权限交给spring,之前我们创建对象用new,而现在直接从spring容器中获取,维护对象之间的依赖关系,从而降低对象的耦合度。
其实现方式是DI也叫依赖注入,其注入有三种方式
构造器注入,setter注入,接口注入
内存管理
linux中一般采用段页式内存管理,分页可以减少内存的消耗,而分段则可以将程序的逻辑结构反应出来,此有利于段的共享。将这两种方法结合起来就形成了段页式存储管理方式。
段页式存储管理方式就是先建立用户程序分成若干段,然后将若干段分为若干页
==和equals()的区别
1、==号在比较基本数据类型时,比较二者的值是否相等,比较引用类型时,以地址比较。
2、equals在没有重写时,比较引用地址,重写可以让其比较二者内容是否相等。
string 、stringbuffer、 stringbuilder三者的区别
string作为final类型是不可被修改其内容的,
stringbuffer与stringbuilder继承与abrestStringbuiler是都可以被修改存储内容的
并且stringbuilder是线程不安全的,但速率将略快与stringbuffer
线程安全的集合
在java中,普通的集合类中,大部分都是非线程安全的,但是也有部分是线程安全的,如vector和hashtable,是很久之前的api,底层是基础synchronized,实现的,性能很差,实际应用中基本不用,但可以使用collections包中的工具类中的synchronizedXxx()方法实现包装,使其变为线程安全的。并且在java5之后,出现在juc包中的一些集合类,如CopyOnWriteArraylist是线程安全的。
反射机制
作为java特有的机制,反射将编译类型与运行类型不同的
list和set的区别
1、list以数组为底层 set以map作为底层
2、list中可以有空值,并且数据可以重复,set中最多只有一个空值,并且数据不能重复
3、list是有序的,可以记住每个数据的位置,而set是无序的。
面向对象的理解
面向对象无疑是很强大,并且主流的编程方式,面向对象将客观现实的问题抽象建立在代码中,并使客观世界的问题可以具象到代码中,方便理解,以及进行操作,以更容易理解的方式将问题抽象出来,以便后续用客观理念就可以对其进行操作。
而面向对象具有三大特性,封装,继承,多态;
封装:将类的成员变量以及实现细节隐藏起来,不允许外部直接访问。
继承:代码共享,减少创建类的工作量,每个子类都拥有弗雷的方法和属性,提高了代码的复用。
多态,多态离不开继承的存在,需要方法的重写,需要弗雷引用指向子类对象。
java四种引用类型
强引用:与对象的关系密切,不会被垃圾回收机制回收
软引用:对于一个只有软引用的对象而言,当垃圾回收机制启动时,可能会被回收
弱引用:对于只有弱引用的对象而言,当垃圾回收机制启动时,肯定会被回收
虚引用:基本上感受不到引用的存在虚引用主要用于跟踪对象被垃圾回收时的状态,虚引用不能单独使用,只能联合引用队列使用。
springMVC编译流程
- 用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器);
- 由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
- DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
- HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
- Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
- HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
- DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
- ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
- DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
- 视图负责将结果显示到浏览器(客户端)。