08 2021 档案
摘要:1796.字符串中第二大的数字 解题思路 遍历这个字符串,维护两个两个值——第一大的数字和第二大的数字。 注意不存在第二大数字的时候要返回-1。 参考代码 class Solution { public int secondHighest(String s) { int maxx1 = -1 , m
阅读全文
摘要:响应时间 响应时间指一个请求从开始到最后收到响应数据所花费的总体时间。 并发数 指系统能同时处理的请求数量 并发连接数 指的是客户端向服务器发起请求,并建立了TCP连接。每秒钟服务器连接的总TCP数量 请求数 也称为QPS(Query Per Second) 指每秒多少请求 并发用户数 单位时间内有
阅读全文
摘要:简述 Fork/Join 是 JDK 1.7 加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的 cpu 密集型运算Fork/Join 在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率Fork/Join 默认会创建与 cpu 核心数
阅读全文
摘要:简述 tomcat分为两部分,connector和container。connector部分组成如下: LimitLatch 用来限流,可以控制最大连接个数 Acceptor 只负责【接收新的 socket 连接】 Poller 只负责监听 socket channel 是否有【可读的 I/O 事件
阅读全文
摘要:简述 ThreadPoolExecutor是java线程池的一种 底层 ThreadPoolExecutor 使用 int 的变量ctl的高 3 位来表示线程池状态,低29位表示线程数量 这些信息存储在一个原子变量 ctl 中,目的是将线程池状态与线程个数合二为一,这样就可以用一次 cas 原子操作
阅读全文
摘要:Controller和RestController的区别 他们都是用来表示Spring某个类的是否可以接收HTTP请求 Controller标识一个Spring类是Spring MVC controller处理器 RestController是Controller和ResponseBody的结合体,
阅读全文
摘要:生产者整合 引入依赖: <!--父工程--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE
阅读全文
摘要:生产者消费者案例 我们这里展示一个生产者和一个消费者的案例 生产者代码: package com.layton; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.clie
阅读全文
摘要:MQ概述 MQ成为Message Queue消息队列,是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。分布式系统一般有两种方式进行通信 1.直接通过远程调用进行通信 2.引入第三方完成间接通信 AMQP协议 即Advanced Message Queuing Protocol,一个
阅读全文
摘要:简述 面试中常常被问到多线程交替输出数字或字母序列的问题,例如AB两个线程交替输出1到100。三个线程交替输出abcabcabc...等 wait notify实现3线程交替输出abc 我们首先抽象出一个用于打印字母的类: package ThreadTest.testOut; public cla
阅读全文
摘要:简述 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。 数据一致性问题 如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数
阅读全文
摘要:简述 ReentrantLock是juc包下的一个类,它是一个可重入且独占式的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但与synchronized关键字相比,它更灵活、更强大,增加了轮询、超时、中断等高级功能。 ReenreantLock可以中断——a线程用着锁,b线程
阅读全文
摘要:步骤 搜索mysql镜像 docker search mysql 拉取mysql镜像 docker pull mysql:5.6 为了宿主机能和mysql容器进行数据交互,我们在宿主机创建mysql目录,笔者这里是在c盘的system32目录下创建 mkdir mysql cd mysql 然后我们
阅读全文
摘要:简述 我们在本地计算机安装mysql、tomcat等应用的话,这个过程是非常繁琐的,但如果我们用了docker,我们的部署就会变得极其方便。在docker中我们想部署某个应用,我们只需搜索镜像,拉取镜像,创建容器,操作容器即可。 docker的通信问题 我们知道docker是宿主机里的容器,我们以m
阅读全文
摘要:数据卷的概念 数据卷是宿主机中的一个目录或文件,容器里面的目录和容器的目录绑定起来后,宿主机中的目录就被成为数据卷。当数据卷绑定好后,对方的修改会立即同步,一个数据卷可以被多个容器挂载。 容器卷的作用 容器数据持久化 外部机器和容器间接通信 容器之间数据交换 配置数据卷 在启动容器时,使用-v参数设
阅读全文
摘要:传送门 https://leetcode-cn.com/problems/find-eventual-safe-states/ 题意 思路 AC代码 import java.util.ArrayList; import java.util.List; class Solution { public
阅读全文
摘要:简述 他们都是LockSupport,park用于暂停某个线程,unpark用于恢复某个线程的运行。 @slf4j public class Test { public static void main(String[] args) { Thread t1 = new Thread(() -> {
阅读全文
摘要:启动和退出容器 启动容器我们用run命令 docker run -it --name=c1 centos /bin/bash 上面这条命令意思就是以centos为镜像创建了一个名字叫c1的容器,参数i代表保持这个容器持续运行,退出后关闭容器,t代表创建一个交互式终端,/bin/bash表示载入容器后
阅读全文
摘要:查看镜像 查看本地有哪些镜像,image是镜像的意思 docker images repostiory是镜像的名称,tag是版本,latest代表最新。IMAGE ID是镜像的唯一标识,CREATED为创建时间。 如果要查看所有镜像的id docker images -q 搜索镜像 在dockerh
阅读全文
摘要:简述 join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。 底层 首先我们需要知道join方法底层是用wait方法实现的,所以join方法也会释放锁。 wait方法机制 这里在介绍底层前
阅读全文
摘要:传送门 https://leetcode-cn.com/problems/valid-triangle-number/ 题意 给定一个包含非负整数的数组,统计其中可以组成三角形三条边的三元组个数。 思路1 对于三角形的三条边需要满足两边之和大于第三边,我们将这个条件转换为两个较小边大于第三边。所以我
阅读全文
摘要:简述 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker对软件跨环境迁移问题提供了一个很好的解决方案。 安装docker 笔者使用的是wi
阅读全文
摘要:简述 在微服务架构中,客户端访问A服务,而A服务需要调用B服务,B服务需要调用C服务,由于网络原因或者自身的原因,如果B服务或者C服务不能及时响应,A服务将处于阻塞状态,直到B服务C服务响应。此时若有大量的请求涌入,容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,造成连
阅读全文
摘要:简述 对于传统的单体应用而言,常使用配置文件来管理所有配置,比如SpringBoot的application.yml文件,但是在微服务架构中全部手动修改的话很麻烦而且不易维护。对于微服务架构而言,一套统一的,通用的管理配置机制是不可缺少的总要组成部分。常见的做法就是通过配置服务器进行管理。 Spri
阅读全文
摘要:简述 不同的微服务一般会有不同的服务地址,客户端在访问这些地址的时候需要记录几十甚至几百个地址,这对于客户端来说过于复杂和难以维护。 这样存在的问题有:客户端会请求多个不同的服务,需要维护不同的请求地址,增加开发难度。而且这样的机制会增加身份认证的难度,每个微服务需要独立认证。 微服务网关 微服务网
阅读全文