SpringBoot 版本命名规则SpringBoot 通常采用数字来命名:主版本号 + 次版本号 + 修正版本号。数字版本解释<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot</artifactId> <version>2.6.0</version> </dependency> 数字2:表示的主版本号,表示是我们的SpringBoot第二代产品,当功能模块有较大更新或者整体架构发生变化时,主版本号会更新。 数字6:表示的是次版本号,增加了一些新的功能但是主体的架构是没有变化的,是兼容的,只是局部的一些变动。 数字0:表示的一般是bug的修改或者是小的变动。 字母解释在 S
TCC 一种成熟的分布式事务解决方案,可用于解决跨库操作的数据一致性问题。TCC 是 Try - Confirm - Cancel 缩写,TCC 事务与传统的数据库事务不同,它存在于业务层面,由系统业务逻辑(事务协调器),进行事务控制。TCC 将原业务服务,拆分为了三个操作。可将这三个操作,对应想象成三个方法,每个方法里有不同的业务代码。 Try:检查预留资源 Confirm:业务执行 Cancel:回撤 Try 里执行的操作 Try在 TCC 中,这是一个初步操作,从业务逻辑上来说,这只是检查资源(数据是否正确或业务上是否可执行等)的操作,真正执行实际业务更改是在 Confirm 中。也就是说,Try 操作过后,与后续执行的 Confirm 操作一起(Try - Confirm),才真正构成一个完整的业务逻辑。但如果 Try 操作出现异常,则会执行 Cancel 操作。(Try - Cancel)。TCC服务需要保证Try操作成功之后,Confirm操作一定能成功。Confirm是对 Try 操作的一个补充。当 TCC事务管理器 决定 commit 全局事务时,就会逐个执
Synchronized 是 Java 多线程编程中常用关键字。Synchronized 是防止线程干扰和内存一致性的简单策略。Synchronized 关键字用法类对象:类名.class 创建的对象。对类对象上锁,可以叫做类锁实例对象:当前类,通过构造方法创建的实例对象。对实例对象上锁,可以叫做实例锁(对象锁)Synchronized 是一种同步锁,也是可重入锁。在不同地方使用 Synchronized 都会获取一把锁,但这把锁是谁的呢?修饰普通方法锁的是当前实例对象——实例锁public synchronized void run() { // some code... } 此写法等价于public void run() { synchronized(this) { // some code... } } 修饰静态方法锁的是当前类对象——类锁public synchronized static void run() { // some code... } 此写法等价于public void run() { synchroniz
在Java中,将基本数据数据类型或对象传递给一个方法,我们通常会说一个是值传递,一个是引用传递,但是真的是这样吗?其实这种说法是错误的,在Java中,所有都是严格的值传递。疑问假设有下面一串代码,两个类Foo和Dog,在Foo类的方法中,操作Dog类class Foo { public static void main(String[] args) { Dog a = new Dog(); a.setName("狗1号"); System.out.println(a.getName()); new Foo().setDog(a); System.out.println(a.getName()); } public void setDog(Dog b) { b = new Dog(); b.setName("狗2号"); } } class Dog { private String name; public void
桥接模式(Bridge pattern):是一种结构型设计模式;基于类的最小设计原则;将实现和抽象放在两个不同类的层次中,使两个层次可以独立改变。其实,我所理解的桥接模式,就是用另一个维度去分类事物,然后两种维度之间,通过聚合来联系在一起。问题桥接模式,主要是解决在某种场景下,导致类爆炸的情况场景例如我们想要描述动物,以及动物的颜色。如果将上面的图片通过代码实现,就是顶层 Animal 类或者接口,然后依次去继承或实现,最终到 黑/白猫 或 黑/白狗 类。当我们新加一个动物:虎,就需对应增加 [颜色]虎 之类的类。换个维度增加一个颜色维度来描述看看:将第三层的颜色,单独抽出一个维度,颜色维度。那我们拥有两个维度了,一个是动物,一个颜色,当我们想要具体的 [动物] + [颜色],只需要在动物类中聚合(引用)一下颜色类即可,而引用的颜色的动物类,应该是最顶层的动物类 Animal。在 Animal 中,引用颜色维度,那么 Animal 就相当于是一座桥梁,将两个维度桥接在一起。代码动物维度Animalpublic abstract class Animal { // 聚合颜色维度
Java11 是甲骨文于2018年9月发布,是在 8 以后发布的第一个长期支持的的版本。之前在看Spring布道师龙之春的演讲视频的时候,他在 Spring Initiallizr 上选择Jdk版本时候,打趣的说道:”这里有13、11、8,三个版本,但是选择哪个呢?“”正确答案只有两个,13或11。“”作为一名开发者。不会还再和孩子说,嗨,老爸我选择了jdk8……“其实就目前国内的情况,也就一些大厂在使用11吧,中小型公司还在选择8,或者更低的版本。但长江后浪推前浪,作为一个前浪,有空也学习了11,省的被拍死在沙滩上。StringString作为一个常用的类,在11里面增加一些新的方法lines()此方法返回 Stream<String>,作用是将一串文字,以换行符分隔并返回行流支持的换行符有:\n 、\r、\ r \ n 正好对应不同操作系统里的换行符public static void main(String[] args) { String str = "第一行 \n第二行 \r第三行\r\n第四行\t不换行"; str.lines().for
洗牌,显然是一个随机算法了。随机算法还不简单?随机呗。把所有牌放到一个数组中,每次取两张牌交换位置,随机 k 次即可。如果你的答案是这样,通常面试官会进一步问一下,k 应该取多少?100?1000?10000?很显然,取一个固定的值不合理。如果数组中有 1000000 个元素,随机 100 次太少;如果数组中只有 10 个元素,随机 10000 次又太多。一个合理的选择是,随机次数和数组中元素大小相关。比如数组有多少个元素,我们就随机多少次。这个答案已经好很多了。但其实,连这个问题的本质都没有触及到。此时,面试官一定会狡黠地一笑:这个算法公平吗?我们再看问题:设计一个公平的洗牌算法。如何公平洗牌思路一洗牌的结果是所有元素的一个排列。一副牌如果有 n 个元素,最终排列的可能性一共有 n! 个。公平的洗牌算法,应该能等概率地给出这 n! 个结果中的任意一个。如思考虑到这一点,我们就能设计出一个简单的暴力算法了:对于 n 个元素,生成所有的 n! 个排列,然后,随机抽一个。这个算法绝对是公平的。但问题是,复杂度太高。复杂度是多少呢?O (n!)。因为,n 个元素一共有 n! 种排列,我们求出
此间少年
事以密成,语以泄败