java面试学习知识点

一、消息队列

1、为什么使用消息队列?

解藕,通过pub/sub模式,让其他系统通过订阅消息降低耦合较高,使用频繁的系统,调用其他系统比较多的一个处理方式。

异步,减少各个系统接口调用时间,优化用户操作体验。让每个系统分别监听一个队列,有订阅消息之后,直接拿到消息进行自行处理逻辑。

消峰,某一时间上大量访问到mysql,可能会把mysql服务弄垮掉,添加mq后解决该问题。

2、消息队列的优点和缺点是什么?

缺点:系统复杂性增加,本来只需要维护A系统,和其他调用系统即可,现在还得维护消息队列mq;除此之外mq可能还会存在一些问题,比如一条消息被重复消费了,或者是A系统在发送的时候丢消息等等。

优点:解藕,异步,消峰

3、activeMQ、rabbitMQ、rocketMQ、kafka怎么选,有什么区别?

activeMq吞吐量相对kafka来说要小,有极低的消息丢失的机率;

rabbitMq吞吐量跟activeMq差不多,都要比kafka低,rabbitmq要比activemq性能要好,延时很低。图形化界面也很完善。丢消息的机率要小一点,因为他erlang语言开发,机制做的也比较重;

rocketMq吞吐量较高,性能也是比较好,功能比较完成,阿里开源的

kafka是做日志采集,大数据之类的选择,吞吐量跟rocketmq差不多,功能简单

4、如何保证消息队列高可用?

rabbitmq 镜像集群模式,不管把消息发送到哪一个节点上,都会把队列queue同步到其他节点。任何一个节点宕机,其他节点上都会保存原有的queue元数据。kafka高可用的原理是因为kafka假如创建了一个topic,这个topic指定了三个partition,每一个pratition会分开分发不同的消息数据,每个 partition都有一个副本,当leader宕机之后会选举follower来处理。rabbitmq交换机是怎么分发消息的,大概有这几种 一个是direct,一个是topic,一个是fanout,最后一个headers

rabbitMq 五大工作模式:简单模式(一个生产者一个消费者)工作队列模式(一个生产者多个消费者)pub/sub 订阅模式(设置交换机类型为:fanout,把消息分发到所有的queue队列上)路由模式(指定的routingkey上,交换机类型为direct)通配符模式(交换机和队列进行绑定,并且指定通配符方式的 routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列)

5、为什么kafka会重复消费,如何保证mq重复消费的幂等性?

消费者消费了消息之后,每隔一段时间都会把自己所消费的消息的offset提交一下,在提交之前,消费者进程被重启了或者发生意外宕机了,这样的话,当消费者再次启动之后,它还会重复消费这条消息

首先幂等性实际上就是指 消息不被重复消费

​ 数据库层面:1、先查询再操作,比如这条消息有一个唯一值可在数据库存储,先查询看是否有该数据才进行操作;2、数据库针对这条消息中唯一标识字段设置唯一约束,再插入的时候,如果是重复消费的话,不能保存到数据库

​ 缓存层面:1、redis存入该消息的一个唯一标识,可作为key,如果该该消息已经入库处理了,通过redis查询到结果进行判断。

6、如何保证rabbitmq消息不丢失?

1⃣️、生产者这部分,可能生产者在给mq发送消息的时候就已经把数据丢失了,发送过程中出现异常,比如链接到mq过程中,网络输送的时候丢失掉了,处理方法:channel 信道 confirm机制方法,会有两个回调方法,可在失败的方法里面出现异常进行重试,这种方法可以吞吐量的问题,避免使用事物的方式去处理生产者端消息丢失问题;

2⃣️、消息发送到mq中,mq接收到消息后,mq宕机,导致rabbitmq 中的消息全部丢失,处理方法:可以讲mq中的消息持久化一下,保存到磁盘当中。 这里将消息持久化涉及到两个步骤,一是将queue队列元数据持久化,二是deliveryMode设置成2;

queueDeclare方法中有个durable参数,该参数设置成true

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R6HSMwMs-1677665386773)(/Users/xingzixian/Library/Application Support/typora-user-images/image-20230131200845852.png)]

AMQP.basicPropertis 中有个deliveryMode 参数,该参数设置成2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aGpJSP9n-1677665386773)(/Users/xingzixian/Library/Application Support/typora-user-images/image-20230131200805417.png)]

3⃣️、消费者这部分消费者已经消费到消息了autoack已经自动返回给rabbitmq说消息已经消费了。其实还没开始处理,消费者就宕机了。处理方法:这时候要把autoAck关闭,不让他自动提交,要手动去处理,消息发送完之后手动提交,告诉rabbitmq说处理完了,如果没告知mq结果就宕机了,这时候在mq里面还会存在这条数据。

7、如何保证kafka消息不丢失?

1⃣️、在这个topic中设置replication.factor的值要大于1,这样设置呢是要求每个partition至少有2个副本。

2⃣️、设置min.insync.repilcas的值大于1,这样设置会将一个leader和至少一个follower保持联系,即便leader突然挂掉,也会有一个follower存在正常运行。

3⃣️、在producer生产者端设置acks = ALL,也就是在接受消息的时候,要把所有的副本都同步完成之后才算数据写入完成

4⃣️、在producer生产者设置retris = MAX,设置重试机制,如果出现消息写入异常的话,开启重试机制,无限重试。

二、redis缓存

1、有没有用到缓存?为什么会用到缓存呢?加入缓存之后有什么好处?同时会带来什么问题?

用到了,缓存优点高性能和高并发,为什么这么说呢,

高性能:比如一个人调用接口访问到数据库,这个数据库sql非常复杂,耗时特别长,当前只有一个人访问,如果很多个人访问,那么用户就等不及了,都需要很长时间才能响应给用户,体验很不好。加入缓存之后,第一个人可能发现缓存没有查询数据库,耗时长,查询到数据写入缓存,其他人再访问的时候就查到了。

高并发:比如我们的app首页的配置数据,可能在app上某个活动的时候,1s有很多个请求,直接访问到数据库,有可能给数据库搞挂了,加入缓存之后,请求到数据,写入缓存,缓存他本身是内存,读写都快,接收到请求的并发多点也能查到,然后返回给用户。

存在的问题:数据同步及时问题,缓存穿透,缓存雪崩,缓存

2、redis和memcahed有什么区别,相比,redis有什么优点?

Memcahed 仅支持 key-value 数据格式,而redis有多种数据格式

redis他有cluster集群模式,memcahed没有

redis是有自己的客户端的。

3、redis都有哪些数据类型?

1、String类型,就是普通的key-value形式

2、hash类型,hash类型指的是 key-对象这样的形式

3、list类型,key对应一个list,这个有一个lrange方法,list是可重复的列表,有序的

4、set类型,无序,自动去重

5、sorted set类型,有序的set,还可以自动去重,比如一些排行榜的需求

4、redis的过期策略是什么?内存淘汰策略是什么?LRU算法?

首先redis的过期策略是有两个,第一个是定期删除,第二个是惰性删除。定期删除是redis在每一段时间就会对一些设置了过期时间的key进行检查,如果过期则删除掉。除此之外还有一部分过期了的key会掠过,就要惰性删除了,惰性删除就是在获取某一个key的时候,redis会检查一遍这个key是否过期,如果过期则删除,然后不做返回。

内存淘汰策略有noeviction 、allkeys-lru 、allkeys-random 、 volatile-lru 、 volatile-random 、 volatile-ttl

1、noeviction 是 当内存不足要写入新数据的时候,直接写入异常,不推荐;2、allkeys-lru 是 当内存不足写入新数据的时候,从可以里面找最近最少使用的key进行删除;3、allkeys-random 是 当内存不足写入新数据的时候,随机删除一个key;4、volatile-lru 是 当内存不足写入新数据的时候,把设置了过期时间的key中找最近使用最少的key进行删除;volatile-random 是 当内存不足写入新数据的时候,把设置了过期时间的key中随机删除一个key;volatile-ttl 是 当内存不足写入新数据的时候,把设置了过期时间的key,更早过期的key优先删除。

5、redis的持久化有哪几种方式?不同的持久化机制有什么区别?底层是怎么实现的?

redis持久化分为两种,一种是RDB,另一种是AOF。

RDB 是 每隔一段时间就会对这段时间内的数据生成一个快照文件,时间是可以设置的;AOF 是 append-only 这样的,每有一条数据增加就会在后面拼接一条指令。

RDB 优点是 1、每隔一段时间就会生成一个快照文件,可以做冷备份,上传到其他云服务上,如果有需要可以及时备份查找;2、RDB它对外提供的读写能力,对IO操作性能较小,让子进程进行对RDB持久化即可;3、如果出现问题,重启,恢复数据比AOF要快。 缺点是 1、可能会丢这段时间的数据。2、如果文件太大,可能会造成redis服务暂停时间长点

AOF 优点是 1、有效的保证数据不丢失,最多只会丢失1s的数据。2、因为AOF是appeng-only模式,他的这个机制是走的os-cache缓存,没有任何磁盘寻址开销,写入性能较好。缺点是1、AOF文件要比RDB文件大很多,AOF写入的性能要比RDB的低一些

6、什么是缓存击穿,缓存穿透,缓存雪崩?

缓存击穿 是指一些热点数据大批量的请求都访问,正好发生在热点数据再redis缓存中失效了。 解决方法:这种热点数据不用设置时间,对于热点数据的访问,尽可能的都加入到缓存当中。

缓存穿透 是在大批量的请求一个缓存中没有的数据,请求全部打到数据库上,导致数据库承受不住压力。 解决方法:1、给这些没有数据的值加入到缓存中,设置为空或者其他字符,减少对数据库的访问。2、通过布隆过滤器来判断。3、在请求端校验。

缓存雪崩 是指大量缓存数据过期,或者是缓存宕机了,一涌而来的请求全部打到数据库层面。 解决方法:1、给缓存设置上不同的过期时间,设置一个随机数时间。2、服务降级,也就是不需要缓存的数据可以放到数据库,必要的热点数据放入到缓存中。3、缓存服务器宕机,可以设置主从redis集群。

三、dubbo和zookeeper原理

1、rpc框架是什么?原理又是怎么实现的?

rpc是一种远程服务调用,服务之间相互调用。包括下面几部分:

客户端(服务消费端) :调用远程方法的一端。

客户端 Stub(桩) : 这其实就是一代理类。代理类主要做的事情很简单,就是把你调用方法、类、方法参数等信息传递到服务端。

网络传输 : 网络传输就是你要把你调用的方法的信息比如说参数啊这些东西传输到服务端,然后服务端执行完之后再把返回结果通过网络传输给你传输回来。网络传输的实现方式有很多种比如最近基本的 Socket或者性能以及封装更加优秀的 Netty(推荐)。

服务端 Stub(桩) :这个桩就不是代理类了。我觉得理解为桩实际不太好,大家注意一下就好。这里的服务端 Stub 实际指的就是接收到客户端执行方法的请求后,去指定对应的方法然后返回结果给客户端的类。

服务端(服务提供端) :提供远程方法的一端。

2、dubbo的工作原理是什么?

dubbo是一款高性能、轻量级的 java rpc 框架。

原理

第一层:service 层,接口层,给服务提供者和消费者来实现的
第二层:config 层,配置层,主要是对 dubbo 进行各种配置的
第三层:proxy 层,服务代理层,无论是 consumer 还是 provider,dubbo 都会给你生成代理,代理之间进行网络通信
第四层:registry 层,服务注册层,负责服务的注册与发现
第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
第六层:monitor 层,监控层,对 rpc 接口的调用次数和调用时间进行监控
第七层:protocal 层,远程调用层,封装 rpc 调用
第八层:exchange 层,信息交换层,封装请求响应模式,同步转异步
第九层:transport 层,网络传输层,抽象 mina 和 netty 为统一接口
第十层:serialize 层,数据序列化层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r7yCATVX-1677665386774)(/Users/xingzixian/Library/Application Support/typora-user-images/image-20230202155358222.png)]

3、Dubbo 的 SPI 机制了解么? 如何扩展 Dubbo 中的默认实现?

SPI 的具体原理:将接口的实现类放在配置文件中,在程序运行过程中读取配置文件,通过反射加载实现类。这样,在运行的时候,动态替换接口的实现类。和 IoC 的解耦思想是类似的。

扩展 Dubbo 中的默认实现 :创建对应的实现类 XxxLoadBalance 实现 LoadBalance 接口或者 AbstractLoadBalance 类。

4、什么是负载均衡?dubbo的负载均衡策略有哪些?

负载平衡主要是用在优化资源使用,最大化吞吐量,最小化响应时间,并避免任何单个资源的过载。使用具有负载平衡而不是单个组件的多个组件可以通过冗余提高可靠性和可用性。

randomLoadBalance (默认)取随机加载策略负载均衡、leastactiveLoadBalance 活跃最小加载策略负载均衡、ConsistentHashLoadBalance 在分库分表、各种集群中就经常使用这个负载均衡策略、RoundRobinLoadBalance 加权轮询加载策略。

5、dubbo使用的序列化方式是什么?

Hessian2

6、zookeeper 是什么?zookeeper集群个数为什么是奇数?

ZooKeeper 是一个开源的分布式协调服务,它的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

ZooKeeper 集群在宕掉几个 ZooKeeper 服务器之后,如果剩下的 ZooKeeper 服务器个数大于宕掉的个数的话整个 ZooKeeper 才依然可用。

7、注册中心挂了以后还可以继续通信吗?

Dubbo 服务消费端会使用 Zookeeper 里面的 Watch 来针对Zookeeper Server 端的/providers 节点注册监听,一旦这个节点下的子节点发生变化,Zookeeper Server 就会发送一个事件通知Dubbo Client 端,Dubbo Client 端收到事件以后,就会把本地缓存的这个服务地址删除,这样后续,就不会把请求发送到失败的节点上,完成服务下线感知。Dubbo的注册中心挂了以后,服务之间还是可以继续通信的。主要是因为Dubbo初始化的时候,消费者会将服务提供者的地址等信息缓存到本地。

四、HTTP协议和TCP协议

1、http和https有什么区别?https的原理是什么?

HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

https的原理
客户端在使用https方式与Web服务器通信时有以下几个步骤:
1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
5)Web服务器利用自己的私钥解密出会话密钥。
6)Web服务器利用会话密钥加密与客户端之间的通信。

2、三次握手 和 四次挥手 的理解?

三次握手

第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

四次挥手

第一次挥手:客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,终止标志位FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
第二次挥手:服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
第三次挥手: 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态,至此,完成四次挥手。

3、为什么连接的时候是三次握手,关闭的时候却是四次握手?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

五、MYSQL数据库

1、innerDB使用的索引结构是什么?为什么不适用链表、红黑树和 B 树?

B+树B+树使用所有叶子结点作为数据页,它是一个双向链表,所有数据记录节点都是按照键值的大小存放在这里;使用非叶子结点作为索引页,记录着每页数据页的页号和该数据页中最小的主键的记录。

哈希表,它会根据Key计算出下标来找到元素,所以对于等值查询很高效,但是不适合区间查询,如果用它来做索引,当进行范围查询时意味着要全部扫描。
跳表,它是在有序链表基础上加了索引层,可以支持区间查询。但是跳表在随数据量增多的情况,索引层也会随着增高,相应的就会增加读取IO的次数,从而影响性能。
二叉树,每个节点最多2个子节点,随着插入的元素增多,而导致树的高度变高,这同样意味着磁盘 I/O 操作次数多,影响到整体查询的效率。
B树,解决了这一问题,它允许1个节点有多个子节点,但并不高效。因为当B树做范围查询时需要使用中序遍历,那么父节点和子节点也就需要不断的来回切换涉及了多个节点会给磁盘I/O带来很多负担。

2、innerDB和myisam的区别?

  1. InnoDB是MySQL默认的存储引擎。
  2. 只有 InnoDB 支持事务,MyISAM不支持事务。
  3. MyISAM不支持行级锁和外键, InnoDB支持。
  4. InnoDB表的大小更加的大,用MyISAM可省很多的硬盘空间。
  5. InnoDB 引擎的索引和文件是存放在一起的,找到索引就可以找到数据,是聚簇式设计。
  6. MyISAM 引擎采用的是非聚簇式(即使是主键)设计,索引文件和数据文件不在同一个文件中。

3、如何选择InnoDB和MyISAM?

InnoDB:如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交和回滚。

MyISAM:读取数据快,空间和内存使用比较低。如果表主要是用于读取记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。

4、回表、索引覆盖、索引下推是什么?

回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。

索引覆盖,只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。

索引下推,条件很多时 在索引遍历过程中,对索引中包含的字段先做判断,过滤掉不符合条件的记录,减少回表字数。

5、为什么要添加索引?索引的优点和缺点?

优点:

**1、**可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性;
**2、**建立索引可以大大提高检索的数据,以及减少表的检索行数;
**3、**在表连接的连接条件,可以加速表与表直接的相连;
**4、**在分组和排序字句进行数据检索,可以减少查询时间中分组和排序时所消耗的时间(数据库的记录会重新排序)
**5、**建立索引,在查询中使用索引,可以提高性能。

缺点:

**1、**创建索引和维护索引,会耗费时间,随着数据量的增加而增加;
**2、**索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间;
**3、**当对表的数据进行INSERT,UPDATE,DELETE的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件)。

6、索引什么时候会失效?

**1、**查询条件包含 or,可能导致索引失效
**2、**如果字段类型是字符串,where 时一定用引号括起来,否则索引失效
**3、**like 通配符可能导致索引失效。
**4、**联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
**5、**在索引列上使用 mysql 的内置函数,索引失效。
**6、**对索引列运算(如,+、-、*、/),索引失效。
**7、**索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
**8、**索引字段上使用 is null, is not null,可能导致索引失效。
**9、**左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
**10、**mysql 估计使用全表扫描要比使用索引快,则不使用索引。

7、日常工作中你是怎么优化 SQL 的?

8、什么是脏读、幻读和不可重复度?

**脏读:**一个事务读取到另一个事务尚未提交的数据。 事务 A 读取事务 B 更新的数据,然后 B 回滚操作,那么 A 读取到的数据是脏数据。

**幻读:**一个事务中两次读取的数据的内容不一致。 事务 A 多次读取同一数据,事务 B 在事务 A 多次读取的过程中,对数据作了更新并提交,导致事务 A 多次读取同一数据时,结果 不一致。

**不可重复读:**一个事务中两次读取的数据量不一致。 系统管理员 A 将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员 B 就在这个时候插入了一条具体分数的记录,当系统管理员 A 改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

9、事务的隔离级别有哪些?

MySQL 支持以上四种隔离级别,读未提交,读已提交,可重复读,可串行读。默认为 Repeatable read (可重复读)。

10、什么是 MVCC 以及实现?

MVCC 的英文全称是 Multiversion Concurrency Control,中文意思是多版本并发控制,可以做到读写互相不阻塞,主要用于解决不可重复读和幻读问题时提高并发效率。
其原理是通过数据行的多个版本管理来实现数据库的并发控制,简单来说就是保存数据的历史版本。可以通过比较版本号决定数据是否显示出来。读取数据的时候不需要加锁可以保证事务的隔离效果。

11、MySQL 的 redo log 和 binlog 区别?

img

12、binlog 日志的三种格式

Statement:基于SQL语句的复制((statement-based replication,SBR))
Row:基于行的复制。(row-based replication,RBR)
Mixed:混合模式复制。(mixed-based replication,MBR)

13、InnoDB 为什么要用自增 ID 作为主键?

自增主键的插入模式,符合递增插入,每次都是追加操作,不涉及挪动记录,也不会触发叶子节点的分裂。
每次插入新的记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。
而有业务逻辑的字段做主键,不容易保证有序插入,由于每次插入主键的值近似于随机
因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,写数据成本较高。

14、聚集索引与非聚集索引的区别?

区别:
**1.**聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个
**2.**聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续
**3.**聚集索引:物理存储按照索引排序;聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序。
**4.**非聚集索引:物理存储不按照索引排序;非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序。
**5.**索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。

15、

六、多线程

1、synchronized的实现原理以及锁优化?

2、synchronized和ReentrantLock的区别?

  • 「锁的实现:」 synchronized是Java语言的关键字,基于JVM实现。而ReentrantLock是基于JDK的API层面实现的(一般是lock()和unlock()方法配合try/finally 语句块来完成。)

  • 「性能:」 在JDK1.6锁优化以前,synchronized的性能比ReenTrantLock差很多。但是JDK6开始,增加了适应性自旋、锁消除等,两者性能就差不多了。

  • 「功能特点:」 ReentrantLock 比 synchronized 增加了一些高级功能,如等待可中断、可实现公平锁、可实现选择性通知。

  • ReentrantLock提供了一种能够中断等待锁的线程的机制,通过lock.lockInterruptibly()来实现这个机制。

  • ReentrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。

  • synchronized与wait()和notify()/notifyAll()方法结合实现等待/通知机制,ReentrantLock类借助Condition接口与newCondition()方法实现。

  • ReentrantLock需要手工声明来加锁和释放锁,一般跟finally配合释放锁。而synchronized不用手动释放锁。

3、CAS?CAS 有什么缺陷,如何解决?

CAS是compare and set,比较然后放值。**CAS **操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。

1. ABA问题2. 只能保证一个共享变量的原子操作3. 循环时间长开销大

解决 CAS 恶性空自旋的较为常见的方案为:
分散操作热点,使用 LongAdder 替代基础原子类 AtomicLong。
使用队列削峰,将发生 CAS 争用的线程加入一个队列中排队,降低 CAS 争用的激烈程度。JUC 中非常重要的基础类 AQS(抽象队列同步器)就是这么做的。

七、JVM原理

1、什么是java内存模型?谈谈自己的理解。

Java 内存模型实际上就是 java 线程内存模型,只要是由线程,线程私有工作内存以及公共的主内存。工作内存会把主内存中用到的共享变量拷贝一份到自己线程内部的工作内存中。

2、JMM数据原子操作都有哪些?

read: 从主内存读取数据。
load: 从主内存中读取的数据加载到工作内存中
use: 在工作内存中使用该变量进行计算
assgin: 将计算好的变量重新赋值到工作内存中
store: 将工作内存附好值的数据在存储到主内存中
write: 将store过来的变量赋值给主内存中变量
lock: 将主内存中数据加锁,标识为线程独占状态
unlock: 将主内存变量解锁,解锁后其他线程可以共享该变量

3、volatile关键字的理解和底层原理

volatile 关键字 底层原理是通过汇编语言 lock前缀指令,他会锁定这块内存区域的缓存并回写到主内存,该操作被称为 缓存锁定

**volatile ** 保证有序性和可见性,但是不能保证原子性。

4、并发编程三大特性

1、可见性 : 线程A和线程B同时操作同一个变量(可见性问题:线程是否操作的同一个变量)

2、有序性 : 重排序

3、原子性 : 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行

八、JAVA基础

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值