fail-fast和fail-safe
fail-fast和fail-safe的区别:fail-safe允许在遍历的过程中对容器中的数据进行修改,而fail-fast则不允许。
fail-fast ( 快速失败 )fail-fast:直接在容器上进行遍历,在遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException异常导致遍历失败。java.util包下的集合类都是快速失败机制的, 常见的的使用fail-fast方式遍历的容器有HashMap和ArrayList等。
在使用迭代器遍历一个集合对象时,比如增强for,如果遍历过程中对集合对象的内容进行了修改(增删改),会抛出ConcurrentModificationException 异常.
fail-fast的出现场景在我们常见的java集合中就可能出现fail-fast机制,比如ArrayList,HashMap。在多线程和单线程环境下都有可能出现快速失败。1、单线程环境下的fail-fast:ArrayList发生fail-fast例子:
123456789101112131415public static voi ...
java语法糖
Java 中有哪些常见的语法糖?
语法糖的存在主要是方便开发人员使用。但其实, Java 虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。
switch 支持 String 与枚举从 Java 7 开始,Java 语言中的语法糖在逐渐丰富,其中一个比较重要的就是 Java 7 中switch开始支持String。Java 中的switch自身原本就支持基本类型。比如int、char等。对于int类型,直接进行数值的比较。对于char类型则是比较其 ascii 码。所以,对于编译器来说,switch中其实只能使用整型,任何类型的比较都要转换成整型。比如byte。short,char(ascii 码是整型)以及int。
switch对String的支持,有以下代码:
12345678910111213141516public class switchDemoString { public static void main(String[] args) { String str = "wo ...
代理模式
代理模式
我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。
代理模式有静态代理和动态代理两种实现方式
静态代理静态代理中,我们对目标对象的每个方法的增强都是手动完成的(*后面会具体演示代码*),非常不灵活(*比如接口一旦新增加方法,目标对象和代理对象都要进行修改*)且麻烦(*需要对每个目标类都单独写一个代理类*)。
** 静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class 文件。**
静态代理实现步骤:
定义一个接口及其实现类;
创建一个代理类同样实现这个接口
将目标对象注入进代理类,然后在代理类的对应方法调用目标类中的对应方法。这样的话,我们就可以通过代理类屏蔽对目标对象的访问,并且可以在目标方法执行前后做一些自己想做的事情。
动态代理相比于静态代理来说,动态代理更加灵活。我们不需要针对每个目标类都单独创建一个代理类,并且也不需要我们必须实现接口,我们可以 ...
ConcurrentHashMap
全面解读ConcurrentHashMap:Java中的高效并发数据结构在Java多线程编程中,确保数据的安全性是至关重要的。ConcurrentHashMap作为Java中线程安全的哈希表实现,为多线程环境下的并发访问提供了可靠的解决方案。本文将深入探讨ConcurrentHashMap的工作原理、优势以及如何在实际应用中充分利用它的功能。
1. 什么是ConcurrentHashMap?ConcurrentHashMap是Java集合框架中的一员,它提供了一种线程安全的哈希表实现。与普通的HashMap相比,ConcurrentHashMap在多线程环境下能够更高效地处理并发访问,保证了线程安全性和性能。
2. ConcurrentHashMap的原理ConcurrentHashMap的核心原理基于两个关键机制:分段锁(Segment Locks)和CAS(Compare and Swap)操作。通过将整个哈希表分成多个段,并在每个段上使用分段锁来保证线程安全,在操作数据时使用CAS操作来保证原子性,从而实现了高效的并发访问。
2.1 分段锁(Segment Locks)Concu ...
java引用类型
强引用(Strong Reference)
定义: 强引用(Strong Reference)是Java中最为普遍的引用类型。当一个对象被强引用关联时,垃圾回收器不会回收这个对象,即使系统内存不足也不会回收。只有当该对象的强引用被显式地释放,或者不再被任何引用关联时,该对象才会成为垃圾回收的候选对象。
示例代码:
123456789101112131415public class StrongReferenceExample { public static void main(String[] args) { // 创建一个对象并建立强引用 Object obj = new Object(); // 强引用 // 对象仍然存在,可以正常使用 System.out.println("Object is still accessible."); // 解除对对象的强引用 obj = null; // 系统内存充足时,垃圾回收器可能不会立即回 ...
常用的负载均衡算法
随机法随机法 是最简单粗暴的负载均衡算法。
如果没有配置权重的话,所有的服务器被访问到的概率都是相同的。如果配置权重的话,权重越高的服务器被访问的概率就越大。
未加权重的随机算法适合于服务器性能相近的集群,其中每个服务器承载相同的负载。加权随机算法适合于服务器性能不等的集群,权重的存在可以使请求分配更加合理化。
不过,随机算法有一个比较明显的缺陷:部分机器在一段时间之内无法被随机到,毕竟是概率算法,就算是大家权重一样, 也可能会出现这种情况。
于是,轮询法 来了!
轮询法轮询法是挨个轮询服务器处理,也可以设置权重。
如果没有配置权重的话,每个请求按时间顺序逐一分配到不同的服务器处理。如果配置权重的话,权重越高的服务器被访问的次数就越多。
未加权重的轮询算法适合于服务器性能相近的集群,其中每个服务器承载相同的负载。加权轮询算法适合于服务器性能不等的集群,权重的存在可以使请求分配更加合理化。
在加权轮询的基础上,还有进一步改进得到的负载均衡算法,比如平滑的加权轮训算法。
平滑的加权轮训算法最早是在 Nginx 中被实现,可以参考这个 commit:https://github.com/ph ...
常用限流手段
固定窗口计数器算法固定窗口其实就是时间窗口,其原理是将时间划分为固定大小的窗口,在每个窗口内限制请求的数量或速率,即固定窗口计数器算法规定了系统单位时间处理的请求数量。
假如我们规定系统中某个接口 1 分钟只能被访问 33 次的话,使用固定窗口计数器算法的实现思路如下:
将时间划分固定大小窗口,这里是 1 分钟一个窗口。
给定一个变量 counter 来记录当前接口处理的请求数量,初始值为 0(代表接口当前 1 分钟内还未处理请求)。
1 分钟之内每处理一个请求之后就将 counter+1 ,当 counter=33 之后(也就是说在这 1 分钟内接口已经被访问 33 次的话),后续的请求就会被全部拒绝。
等到 1 分钟结束后,将 counter 重置 0,重新开始计数。
优点:实现简单,易于理解。
缺点:
限流不够平滑。例如,我们限制某个接口每分钟只能访问 30 次,假设前 30 秒就有 30 个请求到达的话,那后续 30 秒将无法处理请求,这是不可取的,用户体验极差!
无法保证限流速率,因而无法应对突然激增的流量。例如,我们限制某个接口 1 分钟只能访问 1000 次, ...
Tool
GitGit概述版本系统SVN 是集中式版本控制系统,版本库是集中放在中央服务器的,而开发人员工作的时候,用的都是自己的电脑,所以首先要从中央服务器下载最新的版本,然后开发,开发完后,需要把自己开发的代码提交到中央服务器。
集中式版本控制工具缺点:服务器单点故障、容错性差
Git 是分布式版本控制系统(Distributed Version Control System,简称 DVCS) ,分为两种类型的仓库:
本地仓库和远程仓库:
本地仓库:是在开发人员自己电脑上的 Git 仓库
远程仓库:是在远程服务器上的 Git 仓库
工作流程1.从远程仓库中克隆代码到本地仓库
2.从本地仓库中 checkout 代码然后进行代码修改
3.在提交前先将代码提交到暂存区
4.提交到本地仓库。本地仓库中保存修改的各个历史版本
5.修改完成后,需要和团队成员共享代码时,将代码 push 到远程仓库
Git安装下载地址: https://git-scm.com/download
代码托管Git 中存在两种类型的仓库,即本地仓库和远程仓库。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提 ...
框架
Maven基本介绍Mvn介绍Maven:本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
POM:Project Object Model 项目对象模型。Maven 是用 Java 语言编写的,管理的东西以面向对象的形式进行设计,最终把一个项目看成一个对象,这个对象叫做 POM
pom.xml:Maven 需要一个 pom.xml 文件,Maven 通过加载这个配置文件可以知道项目的相关信息,这个文件代表就一个项目。如果做 8 个项目,对应的是 8 个 pom.xml 文件
依赖管理:Maven 对项目所有依赖资源的一种管理,它和项目之间是一种双向关系,即做项目时可以管理所需要的其他资源,当其他项目需要依赖我们项目时,Maven 也会把我们的项目当作一种资源去进行管理。
管理资源的存储位置:本地仓库,私服,中央仓库
基本作用:
项目构建:提供标准的,跨平台的自动化构建项目的方式
依赖管理:方便快捷的管理项目依赖的资源(jar 包),避免资源间的版本冲突等问题
统一开发结构:提供标准的,统一的项目开发结构
各目录存放资源类型说明:
src ...
DB
MySQL简介数据库数据库:DataBase,简称 DB,存储和管理数据的仓库
数据库的优势:
可以持久化存储数据
方便存储和管理数据
使用了统一的方式操作数据库 SQL
数据库、数据表、数据的关系介绍:
数据库
用于存储和管理数据的仓库
一个库中可以包含多个数据表
数据表
数据库最重要的组成部分之一
由纵向的列和横向的行组成(类似 excel 表格)
可以指定列名、数据类型、约束等
一个表中可以存储多条数据
数据:想要永久化存储的数据
参考视频:https://www.bilibili.com/video/BV1zJ411M7TB
参考专栏:https://time.geekbang.org/column/intro/139
参考书籍:https://book.douban.com/subject/35231266/
MySQLMySQL 数据库是一个最流行的关系型数据库管理系统之一,关系型数据库是将数据保存在不同的数据表中,而且表与表之间可以有关联关系,提高了灵活性
缺点:数据存储在磁盘中,导致读写性能差,而且数据关系复杂,扩展性差
MySQL 所使用的 S ...