01 2024 档案
摘要:69. x 的平方根(Easy) 问题描述:实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.8
阅读全文
摘要:278. 第一个错误的版本(Easy) 问题描述:你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错
阅读全文
摘要:704. 二分查找(Easy) 问题描述:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target , 写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums = [-1,0,3,5,9,12], target =
阅读全文
摘要:769. Max Chunks To Make Sorted (Medium) 数组arr是[0, 1, ..., arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成多少块
阅读全文
摘要:565. Array Nesting (Medium) Input: A = [5,4,0,3,1,6,2] Output: 4 Explanation: A[0] = 5, A[1] = 4, A[2] = 0, A[3] = 3, A[4] = 1, A[5] = 6, A[6] = 2. On
阅读全文
摘要:667. Beautiful Arrangement II (Medium) 给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件: ① 如果这个数组是 [a1, a2, a3, ... , an] ,那么数组 [|a1 - a2|, |a2
阅读全文
摘要:697. Degree of an Array (Easy) 给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。 你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 示例 1: 输入: [1, 2, 2, 3, 1] 输出:
阅读全文
摘要:287. Find the Duplicate Number (Medium) 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。 示例 1: 输入: [1,3,4,2,2] 输出
阅读全文
摘要:给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。 找到所有出现两次的元素。 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗? 示例: 输入: [4,3,2,7,8,2,3,1] 输出: [2,3] public List
阅读全文
摘要:448. Find All Numbers Disappeared in an Array (Easy) 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。 找到所有在 [1, n] 范围之间没有出现在数组中的数字。 您能
阅读全文
摘要:645. Set Mismatch (Easy) 集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。 给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的
阅读全文
摘要:485. Max Consecutive Ones (Easy) 给定一个二进制数组, 计算其中最大连续1的个数。 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组只包含 0 和1。 输入数组的长度
阅读全文
摘要:1、移动零(283) 283. Move Zeroes (Easy) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少
阅读全文
摘要:消息100%可靠性投递的解决方案 生产端可靠性投递 保障消息成功发出 保障 MQ 节点的成功接收 发送端收到 MQ 节点(Broker)确认应答 完善的消息补偿机制 解决方案1:消息落库 消息落库,对消息状态进行打标。 解决方案2:二次确认,回调检查 消息的延迟投递,做二次确认,回调检查。 消费端幂
阅读全文
摘要:简单案例:消息生产与消费 pom.xml 配置 <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <!-- 3.6.5 是稳定版本 --> <version>3.6.5</version
阅读全文
摘要:启动 & 停止服务器 启动服务器 rabbitmq-server start & 停止服务器 rabbitmqctl stop_app 查看管控台 http://localhost:15672/ # 用户名 guest # 密码 guest 命令行基础操作 1. 应用 关闭应用 rabbitmqct
阅读全文
摘要:AMQP (Advanced Message Queuing Protocol) 即高级消息队列协议,是一个进程间传递异步消息的网络协议。 AMQP 模型 工作过程如下:首先发布者(Publisher)发布消息(Message),经由交换机 Exchange。交换机根据路由规则将收到的消息分发给与该
阅读全文
摘要:RabbitMQ 是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用中间共享数据,RabbitMQ 是使用 Erlang 语言来编写的,并且 RabbitMQ 是基于 AMQP 协议的。 特点: 开源、性能优秀 Erlang 语言最初用在交换机的架构模式,这样使得 RabbitMQ
阅读全文
摘要:从以下几个方面比较 Kafka 和 RabbitMQ: 吞吐量 Kafka:十万数量级,高吞吐量 RabbitMQ:万数量级 Topic 数量对吞吐量影响 Kafka 的 Topic 可达百/千级,吞吐量下降幅度小,在同等机器下,可以支撑大量的 Topic。 RabbitMQ 无 Topic 概念。
阅读全文
摘要:Kafka 特性可总结如下: 1. 高可用 Kafka 0.8 以前是没有高可用机制的。 Kafka 0.8 以后,通过副本机制来实现高可用,基于副本机制实现 Kafka 的高可用。 2. 持久性 Kafka 集群接收到 Producer 发过来的消息后,将其持久化到磁盘。此外,还支持数据备份。 3
阅读全文
摘要:消息消费的顺序问题 消息在被追加到 Partition 的时候都会分配一个特定的偏移量(offset),Kafka 通过偏移量(offset)来保证消息在分区内的顺序性。为了保证 Kafka 中消息消费的顺序,可以采用以下 2 种方法: 设置 1 个 Topic 只对应一个 Partition 破坏
阅读全文
摘要:Kafka 集群由若干个 Broker 组成,Topic 由若干个 Partition 组成,每个 Partition 可存在不同的 Broker 上。可以这样说,一个 Topic 的数据,分散在多个机器上,即每个机器上都存放一部分数据。 Kafka 0.8 以前 Kafka 0.8 以前是没有高可
阅读全文
摘要:Segment 数据文件 Partition 在物理上由多个 Segment 数据文件组成,每个 Segment 数据文件大小相等、按顺序读写。每个 Segment 数据文件的第一个文件名从 0 开始,后续每个 Segment 文件名为上一个全局 Partition 的最大offset,文件扩展名为
阅读全文
摘要:典型拓扑结构 Kafka 集群包含若干个 Producer,若干个 Broker (Kafka 集群支持水平扩展,一般 Broker 数量越多,整个 Kafka 集群的吞吐量也就越高),若干个 Consumer Group,以及一个 Zookeeper 集群。 Kafka 通过 Zookeeper
阅读全文
摘要:Zookeeper 为 Kafka 提供集群的管理。不仅保存着集群的 Broker、Topic、Partition 等元数据,还负责 Broker 故障发现、Leader 选举、负载均衡等。 Broker 元数据管理 在 Zookeeper 上会有一个专门用来进行 Broker 服务器列表记录的节点
阅读全文
摘要:Kafka 是一种高吞吐、分布式、基于发布订阅模型的消息系统。Kafka 用于离线和在线消息的消费。主要有以下 3 个功能: 消息队列:发布和订阅消息流 容错的持久化方式存储记录消息流:Kafka 将消息数据按顺序保存在磁盘上,并在集群内以副本的形式存储以防止数据丢失 流式处理平台:在消息发布的时候
阅读全文
摘要:Java程序从 .java 文件创建到程序运行要经过两大过程: .java 文件由编译器编译成 .class文件 字节码由 JVM 解释运行 编译过程 .java 源文件会被 Java编译器进行编译为.class文件: Java 编译一个类时,如果这个类所依赖的类还没有被编译,编译器会自动的先编译这
阅读全文
摘要:类的生命周期 从类被加载到虚拟机内存中开始,到释放内存总共有 7 个阶段:加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using),卸载(Unloading)。 其中验证,准备,
阅读全文
摘要:类文件概述 JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件,即类文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。 字节码并不针对一种特定的机器,因此 Java
阅读全文
摘要:垃圾回收的脑图 垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。 判断一个对象是否可被回收 1. 引用计数算法 为对象添加一个引用计数器,当对象增加一个引用时计数器加 1,
阅读全文
摘要:Java 基本类型的包装类的大部分都实现了常量池技术, 即Byte,Short,Integer,Long,Character,Boolean; 这 5 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据, 但是超出此范围仍然会去创建新的对象。 两种浮点数类型的包装类 Float ,
阅读全文
摘要:HotSpot 虚拟机 GC 分类 针对 HotSpot 虚拟机的实现,GC 可以分为 2 大类: 部分收集(Partial GC) 新生代收集(Minor GC / Young GC):回收新生代,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。 老年代收
阅读全文
摘要:1、String 对象的两种创建方式 String str1 = "abcd"; String str2 = new String("abcd"); System.out.println(str1==str2); //false 这两种不同的创建方法是有差别的: 第一种方式是在常量池中获取对象("a
阅读全文
摘要:垃圾收集 (Garbage Collection,GC) 垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。 判断一个对象是否可被回收 堆中几乎放着所有的对象实例,对堆垃圾回
阅读全文
摘要:String 概览 String 被声明为 final,因此它不可被继承。 内部使用 char 数组存储数据,该数组被声明为 final, 这意味着 value 数组初始化之后就不能再引用其它数组。 并且 String 内部没有改变 value 数组的方法,因此可以保证 String 不可变。 pu
阅读全文
摘要:HotSpot 虚拟机对象 对象的创建 对象的创建步骤: 类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用, 并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。 如果没有,那必须先执行相应的类加载过程。 分配内存 在类加载检查通过
阅读全文
摘要:运行时数据区域 程序计数器(Program Counter Register) 当前线程所执行的字节码行号指示器(逻辑) 通过改变计数器的值来选取下一条需要执行的字节码指令 和线程一对一的关系,即“线程私有” 对 Java 方法计数,如果是 Native 方法则计数器值为 Undefined 只是计
阅读全文
摘要:Java 运行数数据区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 JDK 1.8 和之前的版本略有不同: JDK 1.7 之前运行时常量池逻辑包含字符串常量池存放在方法区 JDK 1.7 字符串常量池被从方法区中拿到了堆,运行时常量池剩下的内容还在
阅读全文
摘要:Session Session简介 Session是一种记录客户状态的机制,不同于Cookie的是Cookie保存在客户端浏览器中,而Session保存在服务器上。 客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。 客户端浏览器再次访问时只需要从该Se
阅读全文
摘要:Cookie Cookie简介 Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。 目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。 由于HTTP是一种无状态的协议,服务器单从网络连接上无从
阅读全文
摘要:JSP解析 JSP概述 Servlet 是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。 JSP本质上是Servlet 的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。 Servlet 和 JSP 最
阅读全文
摘要:Servlet简介 Servlet是运行在服务端的Java小程序,是SUN公司提供一套规范, 用来处理客户端请求、响应给浏览器的动态资源。 Servlet的任务有: 1.获取请求数据 2.处理请求 3.完成响应 在Java Web 程序中, Servlet 主要负责接收用户请求 HttpServle
阅读全文
摘要:Java I/O 方式 BIO & NIO & AIO Java IO 的方式通常分为阻塞的 BIO(Blocking IO)、同步非阻塞的 NIO(New IO) 和异步非阻塞的 AIO(Asynchronous IO)。 JDK1.4 之前只支持 BIO,JDK1.4 以后开始支持 NIO,JD
阅读全文
摘要:AIO AIO(Asynchronous I/O)即异步输入/输出库是在 JDK 1.7 中引入的。虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。 对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行IO操作,IO操
阅读全文
摘要:一、NIO NIO(New I/O)即新的输入/输出库是在 JDK 1.4 中引入的,弥补了原来的 I/O 的不足,提供了高速的、面向块的 I/O。 NIO 核心组件: 通道(Channels) 缓冲区(Buffers) 选择器(Selectors) 流与块 I/O 与 NIO 最重要的区别是数据打
阅读全文
摘要:网络操作 Java 中的网络支持: InetAddress:用于表示网络上的硬件资源,即 IP 地址; URL:统一资源定位符; Sockets:使用 TCP 协议实现网络通信; Datagram:使用 UDP 协议实现网络通信。 InetAddress 没有公有的构造函数,只能通过静态方法来创建实
阅读全文
摘要:对象操作 序列化 & 反序列化 如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。 序列化就是将数据结构或对象转换成二进制字节流的过程。 反序列化将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程。 序列化:
阅读全文
摘要:字符操作 编码与解码 编码就是把字符转换为字节,而解码是把字节重新组合成字符。 如果编码和解码过程使用不同的编码方式那么就出现了乱码。 GBK 编码中,中文字符占 2 个字节,英文字符占 1 个字节; UTF-8 编码中,中文字符占 3 个字节,英文字符占 1 个字节; UTF-16be 编码中,中
阅读全文
摘要:字节操作 字节输出流FileOutputStream 创建输出流对象 OutputStream 流对象是一个抽象类,不能实例化。所以,我们要找一个具体的子类 :FileOutputStream。 查看FileOutputStream的构造方法: FileOutputStream(File file)
阅读全文
摘要:磁盘操作 我们要想实现IO的操作,就必须知道硬盘上文件的表现形式。而Java就提供了一个类File供我们使用。 File对象 File:用于表示文件和目录的信息,但是它不表示文件的内容。构造方法: File(String pathname) //根据一个路径得到File对象 File(String
阅读全文
摘要:Java I/O 概览 I/O 介绍 I/O(Input/Outpu) 即输入/输出 。 学术的说 I/O 是信息处理系统(计算机)与外界(人或信息处理系统)间的通信。如计算机,即 CPU 访问任何寄存器和 Cache 等封装以外的数据资源都可当成 I/O ,包括且不限于内存,磁盘,显卡。 软件开发
阅读全文
摘要:容器源码分析 - 并发容器 以下源码分析基于 JDK 1.8。 CopyOnWriteArrayList 1.读写分离 写操作在一个复制的数组上进行,读操作还是在原始数组中进行,读写分离,互不影响。 写操作需要加锁,防止并发写入时导致写入数据丢失。 写操作结束之后需要把原始数组指向新的复制数组。 p
阅读全文
摘要:容器源码分析 - Map 以下源码分析基于 JDK 1.8。 HashMap 为了便于理解,以下源码分析以 JDK 1.7 为主。 1. 存储结构 内部包含了一个 Entry 类型的数组 table。 transient Entry[] table; Entry 存储着键值对。它包含了四个字段,从
阅读全文
摘要:容器源码分析 - List 以下源码分析基于 JDK 1.8。 ArrayList 1. 概览 实现了 RandomAccess 接口,因此支持随机访问。这是理所当然的,因为 ArrayList 是基于数组实现的。 public class ArrayList<E> extends Abstract
阅读全文
摘要:容器中的设计模式 迭代器模式 Collection 继承了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。 从 JDK 1.5 之后可以使用 foreach 方法来遍历实现了 Iterabl
阅读全文
摘要:Java容器概览 容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。 Collection Collection 集合体系图: 1. Set TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找
阅读全文
摘要:正则表达式 概述 是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。 其实就是一种规则。 组成规则 规则字符在java.util.regex Pattern类中:Pattern API 常见组成规则 1. 字符 元字符 说明 x 字符 x \ 反斜线字符 \n 新行(换行)符 ('
阅读全文
摘要:Java 常见类 II Arrays Arrays 是针对数组进行操作的工具类。 常用成员方法 public static String toString(int[] a) //把数组转成字符串 public static void sort(int[] a) //对数组进行排序 public st
阅读全文
摘要:Java 常见类 I Object Object类是类层次结构的根类。每个类都使用 Object 作为超类。每个类都直接或者间接的继承自Object类。 Object 中常用方法有: public int hashCode() //返回该对象的哈希码值。 // 注意:哈希值是根据哈希算法计算出来的一
阅读全文
摘要:注解-Annontation 注解概述 Annontation 是 Java5 开始引入的新特征,中文名称叫注解。 注解是插入到代码中的一种注释或者说是一种元数据。 这些注解信息可以在编译期使用编译工具进行处理,也可以在运行期使用 Java 反射机制进行处理。 注解的用处 生成文档。这是最常见的,也
阅读全文
摘要:泛型-Generics 泛型的概念 在集合中存储对象并在使用前进行类型转换是多么的不方便。泛型防止了那种情况的发生。 它提供了编译期的类型安全,确保你只能把正确类型的对象放入集合中,避免了在运行时出现ClassCastException。 不使用泛型 /** * 这样做的一个不好的是Box里面现在只
阅读全文
摘要:反射-Reflection 反射概念 Java 的反射机制是指在运行状态中: 对任意一个类,都能够知道这个类的所有属性和方法 对任意一个对象,都能调用这个对象的所有属性和方法 反射的作用 检查类的属性和方法 在运行时检查对象的类型 动态构造某个类的对象 可以任意调用对象的方法 反射的使用 1. ja
阅读全文
摘要:异常-Exception 异常的概念 Java 异常是一个描述在代码段中发生异常的对象,当发生异常情况时,一个代表该异常的对象被创建并且在导致该异常的方法中被抛出,而该方法可以选择自己处理异常或者传递该异常。 异常继承体系 Throwable 可以用来表示任何可以作为异常抛出的类,分为两种: Err
阅读全文
摘要:final 和 static 关键字 final 关键字 1. 数据 声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。 对于基本类型,final 使数值不变; 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。 final i
阅读全文
摘要:Object 通用方法 Object 类中的方法一览: public native int hashCode() public boolean equals(Object obj) protected native Object clone() throws CloneNotSupportedExc
阅读全文
摘要:基本运算 == 和 equals() == 判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。 基本数据类型:== 比较的是值 引用数据类型:== 比较的是内存地址 equals() 判断两个对象是否相等。但它一般有两种使用情况: 情况1:类没有重写 equals() 方法。等价于“==
阅读全文
摘要:数据类型 包装类型 Java 八个基本类型,基本类型都有对应的包装类型: 基本类型 大小(bit) 最小值 最大值 默认值 包装类 boolean 1 - - false Boolean char 16 Unicode 0 Unicode 2^16-1 \u0000(Unicode 0) Chara
阅读全文
摘要:一、死锁 线程死锁 死锁是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象。 假设线程 A 持有资源 1,线程 B 持有资源 2,它们同时都想申请对方的资源,那么这两个线程就会互相等待而进入死锁状态。 使用 Java 代码模拟上述死锁场景: public class Reso
阅读全文
摘要:线程池 Executor 框架 Executor 框架是在 Java5 中引入的,通过该框架来控制线程的启动,执行,关闭,简化并发编程。 Executor 基于生产者-消费者模式,提交任务的线程相当于生产者,执行任务的线程相当于消费者。同时,Executor 的实现还提供了对任务执行的生命周期管理的
阅读全文
摘要:一、死锁 线程死锁 死锁是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象。 假设线程 A 持有资源 1,线程 B 持有资源 2,它们同时都想申请对方的资源,那么这两个线程就会互相等待而进入死锁状态。 使用 Java 代码模拟上述死锁场景: public class Reso
阅读全文
摘要:线程池 Executor 框架 Executor 框架是在 Java5 中引入的,通过该框架来控制线程的启动,执行,关闭,简化并发编程。 Executor 基于生产者-消费者模式,提交任务的线程相当于生产者,执行任务的线程相当于消费者。同时,Executor 的实现还提供了对任务执行的生命周期管理的
阅读全文
摘要:并发容器 CopyOnWriteArrayList 1. 读写分离 写操作在一个复制的数组上进行,读操作还是在原数组中进行,读写分离,互不影响。 写操作需要加锁,防止并发写入时导致写入数据丢失。 写操作结束之后需要把原数组指向新的复制数组。 //写操作: //通过过创建底层数组的新副本来实现的。 /
阅读全文
摘要:原子操作类 AtomicInteger 源码解析 java.util.concurrent.atomic下的所有原子操作类都实现了 CAS。 AtomicInteger 内部维护一个变量 Unsafe: private static final Unsafe unsafe = Unsafe.getU
阅读全文
摘要:Lock 体系 AQS AQS(AbtsractQueueSynchronized) 即同步队列器。 AQS 是一个抽象类,本身并没有实现任何同步接口的,只是通过提供同步状态的获取和释放来供自定义的同步组件使用。 AQS 的实现依赖内部的双向队列(底层是双向链表),称为同步队列。 如果当前线程获取同
阅读全文
摘要:并发关键字 关键字一:volatile 可以这样说,volatile 关键字是 Java 虚拟机提供的轻量级的同步机制。 功能 volatile 有 2 个主要功能: 可见性。一个线程对共享变量的修改,其他线程能够立即得知这个修改。普通变量不能做到这一点,普通变量的值在线程间传递需要通过主内存来完成
阅读全文
摘要:并发理论 Java 内存模型 Java 内存模型(即 Java Memory Model,简称 JMM)试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。 本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范。 CPU 缓存 CPU 缓
阅读全文
摘要:一、进程和线程 进程 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当启动 main 方法时其实就是启动了一个 JVM 的进程,而 main 方法所在的线程就是这个进程中的一个线程,称为主线程。 进程是资
阅读全文
摘要:GET 和 POST 比较 Http报文层面: 作用 GET 用于获取资源,而 POST 用于传输实体主体。 参数 GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。不能因为 POST 参数存储在实体主体中就认
阅读全文
摘要:HTTPS HTTP 有以下安全性问题: 使用明文进行通信,内容可能会被窃听; 不验证通信方的身份,通信方的身份有可能遭遇伪装; 无法证明报文的完整性,报文有可能遭篡改。 HTTPS 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TC
阅读全文
摘要:具体应用 连接管理 1. 短连接与长连接 当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源。如果每进行一次 HTTP 通信就要新建一个 TCP 连接,那么开销会很大。 长连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信。 从 HTTP/
阅读全文
摘要:HTTP状态码 服务器返回的 响应报文 中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。 状态码 类别 原因短语 1XX Informational(信息性状态码) 表示请求已接收,继续处理 2XX Success(成功状态码) 请求已被成功接收 3XX Redirection
阅读全文
摘要:HTTP概述 HTTP 协议的特点 支持客户端/服务器模式。 简单快速。 客户端向服务端请求服务时,只需要传输请求方法和路径。请求的方法常用的有 GET、POST。 HTTP 协议简单,是使得 HTTP 服务程序规模小,所以通信速度快。 灵活。 HTTP 允许传输任意类型的数据对象。 无连接。 这里
阅读全文
摘要:分布式事务 分布式事务指事务的操作位于不同的节点上,需要保证事务的 ACID 特性。 2PC 两阶段提交(Two-phase Commit,2PC)是基于分布式架构下的所有节点在进行事务提交时保持一致性而设计的一种算法。 在分布式系统中,每个节点虽然可以知晓自己的操作成功或者失败,却无法知道其他节点
阅读全文
摘要:分布式 ID 分布式 ID 我们知道 ID 是数据的唯一标识,比如比如身份证 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品。分布式 ID 是分布式系统下的 ID,分布式 ID 不存在与现实生活中,属于计算机系统中的一个概念。一个最基本的分布式 ID 需要满足以下要求: 全局唯一 高性能
阅读全文
摘要:分布式锁 在单机场景下,可以使用语言的内置锁来实现进程同步。但是在分布式场景下,需要同步的进程可能位于不同的节点上,那么就需要使用分布式锁。 分布式锁的实现方式: 数据库的唯一索引 Redis 的 SETNX 指令 Redis 的 RedLock 算法 基于 Zookeeper 实现分布式锁 数据库
阅读全文