1.数据结构有哪些
数组、栈、队列、链表、树、散列表、堆、图
2.常用的SQL优化
(1)查询时,能不用* 就不用,尽量写全字段名。
(2)索引不是越多越好,每个表控制在6个索引以内。范围where条件的情况下,索引不起作用,比如where value<100
(3)大部分情况连接效率远大于子查询,但是有例外。当你对连接查询的效率都感到不能接受的时候可以试试用子查询,虽然大部分情况下你会更失望,但总有碰到惊喜的时候不是么…
(4)多用explain 和 profile分析查询语句
(5)有时候可以1条大的SQL可以分成几个小SQL顺序执行,分了吧,速度会快很多。
(6)每隔一段时间用alter table table_name engine=innodb;优化表
(7)连接时注意:小表 jion 大表的原则
(8)学会用explain 和 profile判断是什么原因使你的SQL慢
(9)查看慢查询日志,找出执行时间长的SQL进行优化
(10)尽量避免使用order by
(11)因为where子句后面的条件是执行顺序是从右到左,所以尽量把能过滤掉大部分数据的条件放在最后
3.nginx怎么实现负载均衡
通过配置nginx.conf文件
实现负载均衡的机制
1.轮询机制
根据配置文件的顺序,依次访问服务器. 默认的负载均衡策略
2.权重策略
如果需要设定访问服务器的频次(某个访问的多,某个访问的少),可以通过权重的策略实现.
例如: server localhost:8091 weight=9;
3.IPHASH
如果需要用户与服务器进行绑定时,则设定IPHash
4.最少连接least_conn
将用户的请求转发到有最少处理请求的服务器中,若A目前处理了5个请求,B处理了10个请求,当我的电脑再次访问nginx时,则我的请求将会转发到A服务器中,least_conn可与weight配合使用
4.动态SQL标签以及他们的用法
where标签说明 可以去除 where后边多余的and 或者 or
<select id="findSqlWhere" resultType="User">
select * from demo_user
<where>
<if test="id != null"> id = #{id}</if>
<if test="name != null">and name = #{name}</if>
<if test="age != null ">and age = #{age}</if>
<if test="sex != null ">and sex = #{sex}</if>
</where>
</select>
set标签用法: 去除set条件中多余的,号
<update id="updateSqlSet">
update demo_user
<set>
<if test="name !=null"> name=#{name}, </if>
<if test="age !=null"> age = #{age}, </if>
<if test="sex !=null"> sex = #{sex} </if>
</set>
where id = #{id}
</update>
如果只需要一个条件有效,则使用分支结构用法
<select id="findChoose" resultType="User">
select * from demo_user
<where>
<choose>
<when test="name !=null">
name = #{name}
</when>
<when test="age !=null">
age = #{age}
</when>
<otherwise>
sex = #{sex}
</otherwise>
</choose>
</where>
</select>
5.jsp内置对象
jsp有九大内置对象
request:封装客户端的请求,其中包含来自get和post请求的参数
response:封装服务器对客户端的响应
pageContext:通过该对象可以获取其他对象
session:封装用户会话对象
application:封装服务器运行环境的对象
out:输出服务器响应的输出流对象
config:web应用的配置对象
page:jsp页面本身(想到与java中的this)
exception:封装页面抛出异常的对象
6.DOM元素操作对象
getElementsByTagName 标签名称,得到数组
getElementsByName name属性,得到数组
getElementsByClassName class属性,得到数组
getElementById id属性,单个值
选择器:document.querySelector(css选择器)
document.querySelectorAll(css选择器)
--获取对象: window.document
--调用方法:
getElementById("元素的id的属性的值")--返回1个元素
getElementsByName("元素的name属性的值")--返回多个元素(用数组)
getElementsByClassName("元素的class属性的值")--返回多个元素(用数组)
getElementsByTagName("元素的标签名的值")--返回多个元素(用数组)
write()--向文档写 HTML 表达式 或 JavaScript 代码
title--返回网页的标题
id--设置或返回元素的id
innerHTML--设置或返回元素的内容
7.Spring是什么,怎么理解它的aop,ioc
spring是一个开源的轻量级的java开发框架
IOC:控制反转,把一个类放到spring容器去管理,对象的创建,初始化,销毁的工作都交给spring容器去做。有spring容器控制对象的生命周期
AOP:面向切面编程,把系统分为核心关注点与横切关注点。核心主要是处理业务逻辑,横切主要是权限验证,日志,事务处理。面向切面编程通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
8.数据库的慢查询是什么?
就是查询时间超过了我们设定的时间的语句
9.String,StringBuffer,StringBuilder的区别
可变性:String是不可变的,StringBuffer,StringBuilder是可变的
线程安全性:String,StringBuffer是线程安全的,StringBuilder是非线程安全的
性能:StringBuilder 的性能优于StringBuffer的性能
10.HashMap的底层原理
HashMap 基于 Hash 算法实现的,我们通过put(key,value)存储,get(key)来获取。当传入 key 时HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。
11.线程的状态,创建方式
线程的状态:
新建状态
就绪状态
执行状态
阻塞状态
死亡状态
创建方式:
实现 Runnable 接口;
实现 Callable 接口。
继承 Thread 重写 run 方法;
使用线程池例如用Executor框架
12.SpringCloud的核心组件
Eureka:服务注册于发现。
Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
Zuul: 网关管理,由 Zuul 网关转发请求给对应的服务。
13.Docker的基本指令
docker version查看docker版本
docker info查看docker详细信息
docker --help查看docker命令
docker images查看docker镜像
docker search tomcat从Docker Hub上查找tomcat镜像
docker start 容器ID或容器名称启动容器
docker restart 容器ID或容器名称重新启动容器
docker stop容器ID或容器名称停止容器
docker kill 容器ID或容器名称强制停止容器
docker rm 容器ID或容器名称删除容器
14.Linux的基本指令
目录切换 cd
目录查看 ls [-al]
创建目录【增】 mkdir
删除目录或文件【删】rm
目录修改【改】mv 和 cp
搜索目录【查】find
新建文件【增】touch
修改文件【改】 vi或vim
创建用户 adduser 用户名
15.springmvc的流程
spring mvc 先将请求发送给 DispatcherServlet。
DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller。
DispatcherServlet 再把请求提交到对应的 Controller。
Controller 进行业务逻辑处理后,会返回一个ModelAndView。
Dispatcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象。视图对象负责渲染返回给客户端。
16.springmvc有哪些组件
前置控制器 DispatcherServlet。
映射控制器 HandlerMapping。
处理器 Controller。
模型和视图 ModelAndView。
视图解析器 ViewResolver。
17.sleep()和wait()的区别
类的不同:sleep()来自Thread,wait()来自Object
释放锁:sleep()不释放锁,wait()释放锁
用法不同:sleep()到时间会自动恢复,wait()可以用notify()/notifyAll()直接唤醒。
18.spring的常用注解
1)@Component:将资源交给Spring进行管理,相当于在xml中配置了一个bean。
2)@Controller:标识该类为表现层
3)@Service:标识该类为业务层
4)@Repository:标识该类为持久层
5)@Autowired:自动按照类型注入。
6)@Qualifier:在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。
7)@Resource:直接按照 Bean 的 id 注入,如果根据id无法找到则根据类型进行查找。
8)@Value:注入基本数据类型和 String 类型数据的
9)@Scope:指定 bean 的作用范围(singleton 、prototype、 request 、session、globalsession)。
11)@PostConstruct:用于指定初始化方法。
12)@PreDestroy:用于指定销毁方法。
19.常用的集合
Collection
1. List
Arraylist: Object数组
Vector: Object数组
LinkedList: 双向循环链表
2. Set
HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素 LinkedHashSet:
LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不 过还是有一点点区别的。
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树。)
Map
HashMap: JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是
主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间 LinkedHashMap:LinkedHashMap继承自 HashMap,所以它的底层仍然是基于拉链式散 列结构即由数组和链表或红黑树组成。另外,LinkedHashMap在上面结构的基础上,增加 了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的 操作,实现了访问顺序相关逻辑。
HashTable: 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突 而存在的 TreeMap:
红黑树(自平衡的排序二叉树)
21.spring是基于什么原理实现的
动态代理
反射
Spring通过这些配置,内部通过反射去动态的组装对象
利用java里的反射,反射其实就是在运行时动态的创建和调用对象
22.vue的生命周期
创建前/后,载入前/后,更新前/后,销毁前/后。
1、beforeCreate(创建前)
表示实例完全被创建出来之前,vue 实例的挂载元素$el和数据对象 data 都为 undefined,还未初始化。
2、created(创建后)
数据对象 data 已存在,可以调用 methods 中的方法,操作 data 中的数据,但 dom 未生成,$el 未存在 。
3、beforeMount(挂载前)
vue 实例的 $el 和 data 都已初始化,挂载之前为虚拟的 dom节点,模板已经在内存中编辑完成了,但是尚未把模板渲染到页面中。data.message 未替换。
4、mounted(挂载后)
vue 实例挂载完成,data.message 成功渲染。内存中的模板,已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了。实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了,DOM 渲染在 mounted 中就已经完成了。
5、beforeUpdate(更新前)
当 data 变化时,会触发beforeUpdate方法 。data 数据尚未和最新的数据保持同步。
6、updated(更新后)
当 data 变化时,会触发 updated 方法。页面和 data 数据已经保持同步了。
7、beforeDestory(销毁前)
组件销毁之前调用 ,在这一步,实例仍然完全可用。
8、destoryed(销毁后)
组件销毁之后调用,对 data 的改变不会再触发周期函数,vue 实例已解除事件监听和 dom绑定,但 dom 结构依然存在。
23.常见的几种排序算法
冒泡算法、选择排序、插入排序、希尔排序、归并排序、快速排序
24.mybatis中SQL写法
增
<!--
实现用户新增
1.关于对象参数传递说明: saveUser(User user);
2.mybatis取值语法: #{属性名}
3.用户在执行"更新"操作时,自动的返回影响的行数
-->
<insert id="saveUser">
insert into demo_user(id,name,age,sex)
value (null,#{name},#{age},#{sex})
</insert>
删
<delete id="deleteUserByName">
delete from demo_user where name=#{name}
</delete>
改
<!--修改操作 -->
<update id="updateUser">
update demo_user set name=#{name},age=#{age}
where id=#{id}
</update>
查
<select id="findChildren" resultType="Rights">
select * from rights where parent_id = #{id}
</select>
25.java设计模式
Java 中的23 种设计模式:Factory( 工厂模式),Builder( 建造模式), Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式),Facade(门面模式),Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),Observer(观察者模式),State(状态模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)。
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
说一下你熟悉的设计模式
单例模式:保证被创建一次,节省系统开销。
工厂模式(简单工厂、抽象工厂):解耦代码。
观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。
模版方法模式:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。
状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
26.git指令
git branch 查看本地所有分支
git status 查看当前状态
git commit 提交
git branch -a 查看所有的分支
git branch -r 查看远程所有分支
git commit -am “init” 提交并且加注释
git push origin master 将文件给推到服务器上
git remote show origin 显示远程库origin里的资源
git push origin master:develop
git push origin master:hb-dev 将本地库与服务器上的库进行关联
git checkout --track origin/dev 切换到远程dev分支
git branch -D master develop 删除本地库develop
git checkout -b dev 建立一个新的本地分支dev
git merge origin/dev 将分支dev与当前分支进行合并
git checkout dev 切换到本地dev分支
git remote show 查看远程库
git add .
git rm 文件名(包括路径) 从git中删除指定文件
git clone 路径 从服务器上将代码给拉下来
git config --list 看所有用户
git ls-files 看已经被提交的
git rm [file name] 删除一个文件
git commit -a 提交当前repos的所有的改变
git add [file name] 添加一个文件到git index
git commit -v 当你用-v参数的时候可以看commit的差异
git commit -m “This is the message describing the commit” 添加commit信息
git commit -a -a是代表add,把所有的change加到git index里然后再commit
git commit -a -v 一般提交命令
git log 看你commit的日志
git diff 查看尚未暂存的更新
git rm a.a 移除文件(从暂存区和工作区中删除)
git rm --cached a.a 移除文件(只从暂存区中删除)
git commit -m “remove” 移除文件(从Git中删除)
git rm -f a.a 强行移除修改后文件(从暂存区和工作区中删除)
git diff --cached 或 $ git diff --staged 查看尚未提交的更新
git stash push 将文件给push到一个临时空间中
git stash pop 将文件从临时空间pop下来
27.说一下 spring mvc 运行流程?
spring mvc 先将请求发送给 DispatcherServlet。
DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller。
DispatcherServlet 再把请求提交到对应的 Controller。
Controller 进行业务逻辑处理后,会返回一个 ModelAndView。
Dispatcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象。
视图对象负责渲染返回给客户端。
28.配置文件的优先级
spring boot 核心的两个配置文件:
bootstrap (. yml 或者 . properties):boostrap 由父ApplicationContext 加载的,比 applicaton 优先加载,且 boostrap 里面的属性不能被覆盖;
application (. yml 或者 . properties):用于 spring boot 项目的自动化配置。
bootstrap.yml>bootstrap.properties>application.yml>application.properties
29.远程调用是通过什么实现的
Feign
补充:
为什么使用feign方式的服务调用(优化结构,简化服务调用过程代码的编写)
如何基于feign方式实现远程服务调用(依赖,配置,feign接口的定义)
@EnableFeignClient注解的作用是什么(描述配置类,例如启动类,用于告诉底层要启动feign start组件)
@FeignClient注解的作用是什么(告诉Feign Starter,在项目 启动时,为此注解描述的接口创建实现类–代理类)
-如何理解基于Feign方式的远程服务调用(声明式远程服务调用–告诉底层做什么,底层封装了服务调用过程)
Feign方式如何实现负载均衡(feign默认继承ribbon组件实现负载均衡,底层基于ribbon组件实现)
feign接口指向的对象是谁(实现了接口的一个代理对象)
服务的消费方是如何调用服务提供方的服务的(RestTemplate)
30.SpringCloud与SpringBoot区别
SpringBoot专注于快速方便的开发单个个体微服务。
SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,
为各个服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、精选决策、分布式会话等集成服务。
SpringBoot可以离开SpringCloud独立开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。
SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。
31.什么是SpringCloud Bus?
SpringCloud Bus是将分布式的节点用轻量的消息代理连接起来,用它可以用来广播配置文件的更新和服务的直接通讯,还有用于监控,如果配置文件一更新,只需要发送一次,就可以让客户端重新去读取配置文件
32.Nginx和Zuul的区别
不同点:
首先 , Nginx是C语言开发,而 Zuul 是Java语言开发
2)其次,Nginx负载均衡实现,采用服务器实现负载均衡,而Zuul负载均衡的实现是采用 Ribbon + Eureka 来实现本地负载均衡.
Nginx适合于服务器端负载均衡,Zuul适合微服务中实现网关
Nginx相比Zuul功能会更加强大,因为Nginx整合一些脚本语言( Nginx + lua )
Nginc 是一个高性能的HTTP 和反向代理服务器, 也是一个 IMAP / POP3 /SMIP 服务器. Zuul是 Spring Cloud Netflix 中的开源的一个API Gateway 服务器,本质上是一个web servlet 应用, 提供动态路由,监控,弹性,安全等边缘服务的框架. Zuul 相当于是设备和Netflix 流应用的Web 网站后端所有请求的前门
相同点:
可以实现负载均衡 (Zuul使用的是Ribbon实现负载均衡)
可以实现反向代理 (即隐藏真实ip地址)
可以过滤请求,实现网关的效果
33.css、html、js的区别
网页现在的新标准是W3C。目前的模式是html css javascript,如何理解呢,就是html是网页的结构,CSS是网页的样式,javascript是行为。结构就是盖房子先要把结构建出来,然后用CSS来装饰。其实你在用dreamweaver做网页时就已经用到了CSS,比如你用DW的属性面板来设置一个字的字体、颜色和大小,当你选好后,就会自动生成一个.style1的红色代码,在之间不知道你注意过没有,这就是CSS,这样讲的话你应该能理解html和CSS的区别了吧
34.什么是XSS攻击?如何防范XSS攻击?
XSS攻击又称CSS,全称Cross Site Script (跨站脚本攻击),其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。
非持久型xss攻击:顾名思义,非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。
持久型xss攻击:持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。
也可以分成三类:
反射型:经过后端,不经过数据库
存储型:经过后端,经过数据库
DOM:不经过后端,DOM- xss是通过url传入参数去控制触发的。
解决方法:
1.利用 php htmlentities()函数对传入参数的非法的 HTML 代码包括单双引号等进行转义。但是,中文情况下, htmlentities() 却会转化所有的 html 代码,连同里面的它无法识别的中文字符也给转化了。
2.利用 php htmlspecialchars()函数对传入参数的非法的 HTML 代码包括单双引号等进行转义,需要注意的是第二个参数默认是 ENT_COMPAT,函数默认只是转化双引号("),不对单引号(’)做转义。更多的时候要加上第二个参数,应该这样用 : htmlspecialchars($string,ENT_QUOTES)对单双引号都进行转义。如果需要不转化任何的引号第二个参数使用ENT_NOQUOTES。
3.通过正则表达式过滤传入参数的html标签来防范XSS攻击
35.CSRF 攻击是什么?如何防范?
CSRF也被称为 one-click attack或者 session riding,中文全称是叫跨站请求伪造。
攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。、
如何防范?
1.验证 HTTP Referer 字段
2.使用验证码
3.在请求地址中添加token并验证
4.在HTTP 头中自定义属性并验证
36.DI的实现原理
依赖注入可以通过setter方法注入(设值注入)、构造器注入和接口注入三种方式来实现
getBean() 开始:区分两种情况
单例、非延迟加载情况:
1.容器启动后就会调用getBean() ->
2.instantiateBean()实例话对象 ->
3.BeanWapper 放入IOC容器 beanWarpperMap ->
4.populateBean()依赖注入
原型、延迟加载情况:
当使用到Bean ,调用getBean时才实例化,流程同上
37.微服务在项目中的应用
实现更大数据量的存储。(增大系统容量)
可以提高系统的高可用性。
提高系统的可重用性。
可更好提高系统的性能。
38.SQL注入原理及防止SQL注入?
1、SQL注入原理
就是通过利用一些查询语句的漏洞,将SQL语句传递到服务器解析并执行的一种攻击手段。
2,如何防止SQL注入?
1)不要使用动态SQL
2)不要将敏感数据保留在纯文本中
3)限制数据库权限和特权
4)避免直接向用户显示数据库错误
5)对访问数据库的Web应用程序使用Web应用程序防火墙(WAF)
6)定期测试与数据库交互的Web应用程序
7)将数据库更新为最新的可用修补程序
39.java8相比java6,java7有什么新的特性
Lambda 表达式,允许像对象一样传递匿名函数
Stream API,充分利用现代多核 CPU,可以写出很简洁的代码
Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用
扩展方法,现在,接口中可以有静态、默认方法。
重复注解,现在你可以将相同的注解在同一类型上使用多次。
HashMap 使用散列表和红黑树实现。之前只使用了散列表。
40.count(1)、count(*)、count(字段)的区别
对于count(1)和count(*),MySQL的优化是完全一样的,根本不存在谁更快!
但依旧建议使用count(*),因为这是SQL92定义的标准统计行数的语法。
COUNT(字段)
进行全表扫描,判断指定字段的值是否为NULL,不为NULL则累加。
性能比count(1)和count(*)慢。
SELECT COUNT(*) FROM emp #低效
SELECT COUNT(1) FROM emp #高效
41. having 和where的区别?
group by后的过滤必须用having
where里不能用别名,不能出现聚合函数,比having高效
having与where不同点
(1)where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据。
(2)where后面不能写分组函数,而having后面可以使用分组函数。
(3)having只用于group by分组统计语句。
42. GROUP BY语句
GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。
43. 何为悲观锁、乐观锁
悲观锁:
每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。
乐观锁:
每次去拿数据的时候都认为别人不会修改,所以不会上锁。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
44.什么是死锁?
当线程A持有独占锁a,并尝试去获取独占锁b的同时,线程B持有独占锁b,并尝试获取独占锁a的情况下,就会发生AB两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁。
45.怎么防止死锁?
尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。
尽量使用 Java. util. concurrent 并发类代替自己手写锁。
尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。
尽量减少同步的代码块。
46.索引
分类:
1,单值索引: 一个索引只包含一个字段
2,唯一索引: 一个索引只包含一个字段,但字段的值不能重复
3,复合索引: 一个索引可以包含着多个字段
使用步骤:
1,创建索引(经常按照指定字段查询) + 使用索引
索引:好处是:提高查询效率 坏处是:索引需要单独的一张表
创建复合索引:一个索引包含着多个字段,遵循最左特性
#1.索引:好处是:提高查询效率 坏处是:索引需要单独的一张表
#1.1 查看索引:show index from 表名
SHOW INDEX FROM emp #主键自带索引
#1.2 创建单值索引:一个索引只包含一个字段
CREATE INDEX ename_index ON emp(ename)
#1.3 创建唯一索引:一个索引只包含一个字段,索引列值不能重复
#create unique index uni_index on emp(job)#失败,因为job的值有重复的
CREATE UNIQUE INDEX uni_index ON emp(sal)
#1.4 创建复合索引:一个索引包含着多个字段,遵循最左特性
CREATE INDEX fuhe_index ON emp(job,hiredate,comm)
#1.5 使用索引:背后的故事,按照索引列去查
SELECT * FROM emp WHERE ename='jack' #使用单值索引
SELECT * FROM emp WHERE sal=10000 #使用唯一索引
#使用复合索引,遵循最左特性
EXPLAIN SELECT * FROM emp WHERE job='总监' #生效
EXPLAIN SELECT * FROM emp WHERE job='总监'AND hiredate='2019-1-1'#生效
EXPLAIN SELECT * FROM emp WHERE hiredate='2019-1-1' #失效
EXPLAIN SELECT * FROM emp WHERE hiredate='2019-1-1'AND comm=100#失效
EXPLAIN SELECT * FROM emp WHERE hiredate='2019-1-1' AND job='总监'#生效
#1.6 查询SQL的执行计划/性能(看看用没用索引)
EXPLAIN #possible_keys用到的索引
SELECT * FROM emp WHERE ename='jack'
EXPLAIN
SELECT * FROM emp WHERE sal=10000
#1.7 删除索引
ALTER TABLE emp DROP INDEX fuhe_index
47. 并行和并发有什么区别?
并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。
并行:多个处理器或多核处理器同时处理多个任务。
48.线程和进程的区别?
一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以有多个线程来增加程序的执行速度。