自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 LongAdder为什么比AtomicLong性能更好?

LongAdder底层则是存在一个long类型变量base,在低并发情况下进行计数,以及一个cell[]类型的数组在高并发情况下使用,将多个线程均匀分配到各自的cell上进行累加,最后将cell的结果汇总起来得到最终结果。二维的空间消耗,以及因为需要对cell数组进行汇总操作才能得到最终结果,所以无法实时获取最新的实际总和,当然,不会影响最终结果。LongAdder相较于AtomicLong的区别就是减少了乐观锁的重试次数,代价则是消耗更多的空间(在高并发情况下),低并发情况下二者性能相差不大。

2024-04-26 22:49:25 183

原创 ThreadLocal的静态内部类ThreadLocalMap所使用的Entry为什么要使用弱引用,而不是强引用?

线程栈中的自定义的ThreadLocal变量指向了堆中的ThreadLocal实例对象,这是毫无疑问的强引用,且如果只存在这一对引用关系,则线程销毁,ThreadLocal变量被GC回收的同时,堆中的实例对象也会被销毁,不会存在内存泄漏的问题。分析:如果此时线程直接结束,万事大吉,因为value值的引用只存在当前线程的工作内存中,一旦线程销毁,关于堆中value对象的强引用也会随之销毁,进而销毁堆中的value实例对象。当内存空间不足时,垃圾回收器可能会回收具有软引用的对象,但并不是一定会回收。

2024-04-26 22:38:34 301

原创 SpringBoot 2.7.15 + JDK8 整合Knife4j

解决方案:引入基于OpenApi3规范的Knife4j依赖,这个版本的Knife4j底层是基于Springdoc-openapi-ui框架,区别于Springfox,这个框架更新频率相对高得多,对新版本的Springboot有着更好的的支持。一开始不知道是版本不兼容的问题,结果一直以为是自己配置有问题,搞了老半天。

2024-03-18 22:27:45 806

原创 MySQL的部分小问题解答

通过查看user表的Host属性,可以看到mysql服务器允许用户访问服务器时使用的IP地址,如果是localhost则代表这个用户只可以本地访问,如果是%就代表这个用户可以从任何ip访问到服务器。指的是对sql语句的检验程度,宽松模式可以允许少量不符合规定的sql语句执行而不报出任何错误,目的使得大多数sql语句符合标准的sql语法,从而避免在不同厂商的数据库之间切换时,需要修改大量。在修改之前的建立的库需要使用命令进行手动修改,之后的会自动生效。而字符集表示一个字符所用的最大字节长度,在某些方。

2024-03-14 20:33:17 344

原创 访问者模式--学习理解

常规思路首先就是在类中新定义这些方法,或者直接将所有元素一个个拿出来进行处理,在放回数据结构,但这显然不符合开闭原则,也不利于实现即每次需求的变动都必须修改原有的代码,并且如果业务持续膨胀,那这个类的内部就会充满各种各样的方法,不便于管理,也容易在使用时产生歧义。这内部的原因就是数据结构的具体的操作耦合在一起带来的问题。缺点:Visitor类封装的操作内部需要使用到数据结构中的具体元素,即访问者关注了其他类的内部细节,(如果不知道细节,很难完成具体操作),这显然是迪米特法则所不建议的。

2024-03-14 09:53:25 369

原创 模板方法模式--学习理解

初始化init,刷新refresh,关闭close,而不同的类型的上下文的init,refresh,close的具体实现可能会有所不同,也可能相同。当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理。当我们需要对三个过程的某些过程进行特殊化处理,就只需要创建一个上下文类来继承抽象类,并定制化重写里面的三个方法即可。1.当我们需要修改算法骨架时间,例如增加一个过程,就只需要修改抽象类,达到一处修改,处处生效的效果,利于维护;

2024-03-14 09:51:08 273

原创 策略模式--学习理解

分析:例如星穹铁道的自动战斗系统,不同命途的角色在自己回合自然而然会有不同的行动策略,例如奶妈就会根据队友血量来判断是否释放回复技能,而C位则会根据敌方血量比例来判断是否需要释放平a还是更加强力的技能。例如不同命途的C位在面对敌人可能会采取相同的策略,比如智识,巡猎,既然采取相同策略,则存在代码冗余,以及一处修改,其他地方也得改的问题。解决思路:采取策略模式,将变化的行动策略抽取成一个个对象,然后命途类负责聚合这些策略对象,并通过调用策略对象完成行动。好处:后续增加新的策略,只需要新增新的策略对象。

2024-03-14 09:49:51 336

原创 状态模式--学习理解

解决思路:采用状态模式,订单类内维护一个成员变量状态类对象以保存当前状态,而状态类内部则定义指定状态下可以进行的状态转换操作。由于不同的状态类对于状态转换方法具有不同的具体实现,所以处于不同状态下的订单调用的效果取决于当前状态类的具体实现,从而达到一个对象在内部状态改变时改变它的行为。订单状态之间的转化是有严格限制的。状态模式的核心:状态决定行为,不同的状态拥有不同的行为。使用范围::当一个事件或者对象有很多种状态,状态之间会相互转换,对不同的状态要求有不同的行为的时候,可以考虑使用状态模式。

2024-03-14 09:48:57 338

原创 职责链模式--学习理解

也可以理解为将if-else链修改为对象链,通过将if-else单元抽象为类单元的方式,在类的内部定义具体处理方式和匹配规则,从而使得一个请求可以在一条链上被多个处理类的实例判断,直到匹配的接收者完成处理。导致这一问题的核心在请求的发送者和接收者耦合在了一起,即因为if-else的方式,一种类型的请求只能对应一种处理方式,也可以理解为将请求的发送者和请求的接收者绑定在了一起,但实际上这个绑定关系是随时会发生变化的。因为具体的处理方式都是定义在单独的类内,可以很好的进行单独维护。来判断请求的最终处理方式。

2024-03-14 09:47:42 365 1

原创 代理模式--学习理解

基于这种设计,我们无需在本地实例化重型的远程对象,就能够完成调用,并且本地模块无需导入目标对象的具体实现,实现模块间的解耦。这种设计的目的就类似于只有我们确实需要使用视频封面对象的时候,视频封面对象才会被加载。例如b站的视频展示主页,系统都会加载好视频封面,但是如果我们快速向下滑动,就会出现一部分视频开始没有封面,但是随后又很快加载出封面的情况。2.远程代理,通过本地对象来完成对远程对象的访问,本地对象就可以看作是远程对象在本地的代理。3.cglib代理。1.静态代理,代理对象和目标对象实现相同的接口。

2024-03-14 09:46:00 506 1

原创 原型模式--学习理解

/当前这个对象以对象流的方式输出。在通过一系列api处理流对象,完成反序列化,从而得到新对象。在java中的实现方式主要是有该需求的原型类实现Cloneable接口。Cloneable接口的默认实现是浅拷贝,即对于基本数据类型。使用一系列api,将原型对象序列化得到流对象,原型模式:使用原型实例指定创建对象的细节,并且通过拷贝这些。解决的问题:常规的手动获取细节,创建新对象的方法效率太低,第二种的优点:当类的属性发生变化时,无需修改克隆方法,而。是直接的值传递,对于引用数据类型,则使用的是地址传递,

2024-03-13 17:26:56 333

原创 观察者模式--学习理解

常见的例子:分布式系统的配置刷新问题,分布式系统的数据一致性问题,改变,所有下属的子系统都将得到通知并自动更新本地存储的控制状态。完成注册,当存在向所有子系统广播消息时,由控制中心来完成广播操作。一个子系统需要向其他所有子系统广播通知,只需要发送消息给控制中心,依赖关系,非常不利于对单个子系统的测试,和多个子系统的联调测试。例如游戏中实时出现的全服公告,实际就是当用户登录游戏,就。相当于在控制中心注册了一个对象,只需要在控制中心进行操作,即可。当子系统数量较多时,各个子系统之间相互调用,构建出极其复杂的。

2024-03-13 17:26:25 378

原创 备忘录模式--学习理解

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,做法:新建一个定制的备忘录类,并给目标类新建一个方法,该方法。在将类的内部属性统一封装进入一个备忘录对象并返回。说白了就是新建一个类,备份好需要恢复的数据,并在需要的时候,使用场景:游戏存档,数据库的事务管理,文本编辑器的回退操作。根据这个类存储的信息完成恢复操作,从而避免了在外界直接暴露类的内部。缺点:如果类的成员过多,并且是多用户同时运行,势必会导致。在类的其他代码中直接暴露类的内部属性。对象回复类的内部属性的方法。

2024-03-13 17:25:54 289

原创 中介者模式--学习理解

来封装交互逻辑,确保了各个Service之间的独立性。而中介者模式的思路是,通过提供一个中介者,中介者内部封装好子系统。中介者模式通过封装对象交互逻辑,并暴露接口给对象来实现交互逻辑。缺点:中介者模式负责封装所有的对象交互逻辑,必然会导致中介者类。也是中介者,负责封装各个DAO之家的交互逻辑,从而确保各个DAO之间的。中介者模式:用一个中介对象来封装一系列的对象交互。个对象的数据一致性问题,观察者的作用还是起到帮忙发送消息,通知其他。的调用,可以有效避免在其他对象内部独立封装交互逻辑,确保因为因为对。

2024-03-13 17:25:24 332

原创 迭代器模式--学习理解

并且当聚合对象的内部聚合方式发生改变,例如从数组改为了List,那原本。解决:引入迭代器模式,每个聚合类内部都实现迭代器接口,定义好遍历操作,分析:当我们定义了很多中类型的聚合对象,例如棋盘对象聚合了棋子对象,菜单对象聚合了菜品对象,以数组的方式实现,物品归属表。后期如果聚合类的内部结构发生改变,只需要同步修改类内部的迭代操作,这样就可以确保对于任何聚合对象,都可以又统一的方式来完成遍历操作。的内部细节,聚合对象也必须向外暴露细节,不遵循迪米特法则。即提供一种统一的方式来完成聚合对象的遍历操作。

2024-03-13 17:24:48 319

原创 解释器模式--学习理解

分析:通常是将一个表达式首先通过词法分析器拆解成词法单元,而后。解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个。使用场景:如果一种特定类型的问题频繁出现,那么就可以考虑将该。这些词法单元在通过语法分析器构建语法分析树,最终形成一个抽象的语法。问题的各个实例表述成为一个简单语言中的句子。这种设计通过将问题概括组装成一个个简单的句子,从而。可以更加便捷,简洁,高效的实现模块间,编程人员之间的信息传递。其中词法分析器和语法分析器就可以看作是解释器。解释器,这个解释器使用该表示来解释语言中的句子。

2024-03-13 17:24:15 361

原创 享元模式--学习理解

在一定程度上可以认为这些对象的种类(内部状态)是有限的,例如棋子,英文字母,池技术的实现使用享元模式的思想,不过效果并不是减少对象数量,而是。引入共享对象的思想。考虑一个围棋对战游戏,如果在开发中,玩家每下一个棋子,就向。那在服务器运行时,内存中就会出现大量的棋子对象,当我们需要构建大量细粒度的对象,并且这些对象具有相似性,且。名为棋盘的容器中追加一个棋子对象(描述坐标和颜色),如果有大量。在依靠共享完成正常运行,并尽可能限制内存中对象的数量,避免当。极大的减少内存中棋子的数量,提高服务器运行效率。

2024-03-13 17:23:35 298

原创 工厂模式--学习理解

子类工厂依照自己的细分种类,使用if-else来实现抽象工厂方法,(情理之中,更加符合语境,具有工厂的能力,但不是某个工厂的子工厂)。在这种情况下,仅靠一个工厂来实现,就需要大量的n*n级别的。工厂方法模式的核心思想就是将实例化操作,也就是工厂创建产品的操作,和简单工厂模式的区别:工厂数量不再是单个工厂,增加新的产品,实现。简单工厂模式属于创建型模式,是工厂模式的一种,即由一个工厂对象。当需要创建的对象具有较多的种类,并且存在后续增加种类的可能性,达到降低其他部分的代码和具体种类的对象的耦合度的。

2024-03-13 17:22:52 290

原创 外观模式--学习理解

因此,打印机系统只需要将在自己的open()方法内完成自检任务,定义一个统一的接口规范,然后所有的打印机系统厂商负责提供这个接口。任务,打印机连接电脑时就会自动将这个接口的具体实现导入电脑,电脑系统。外观模式通过定义一个一致的接口,用以屏蔽子系统的细节,使得。例如,电脑系统和打印机系统,一台电脑需要启动打印机系统完成。方法,那电脑系统的编程人员就需要很了解打印机系统设计的一个个自检。并且,打印机有很多品牌,每个品牌的打印机系统具体细节又不一样。一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统。

2024-03-13 17:19:58 336

原创 装饰器模式--学习理解

分析:如果考虑所有种类的buff,将其作为boolean类型的成员变量,当然,我们也可以考虑,将所有的buff放入一个ArrayList里面,对角色包装一层,显然可以实现动态构建,也能有效避免大量的if-else,如果使用建造者模式,增加一个buff,就进行构建。当然,我们也要想到,装饰者模式提供的只是一种思路,具体实现。如果采用装饰者模式,角色每增加一层buff,就使用装饰者。建造模式难以实现动态构建,且产品生产完毕,在想继续修改就需要。又是问题,又存在装饰者模式层层封装,导致要访问原始对象就需要。

2024-03-13 17:19:22 334

原创 组合模式--学习理解

同时,继承应当满足“ ** 是 ** ”的原则,显然院系并不是学校,1.如何安排学校,学院,院系这三个类,以方便快捷的访问到学校。此外,如果我们需要访问某个院系,就必须要拿到学院对象,要拿到。2.尚品甄选项目中,使用每一个对象都是相同类型的个体,但是。他们之间的关系是整体和部分的关系,而不是抽象概念和具体实现的关系。的思想,可见设计模式并不依赖于具体的代码实现,其关键是如何理解。并使用设计模式的思想,来安排类和类之间的关系,以使得设计出的。或者删除一个学校类时,继承这些类的下属类就都会受到影响。

2024-03-13 17:18:42 343

原创 命令模式--学习理解

可以通过调用Command的execute方法来完成任务,而方法调用者完全无需。知道Command内部聚合的是什么方法执行者来完成任务,Command只需要。这些方法的类,即方法调用者。然后定义好方法的执行者,在定义好类实现Command类,在内部。请求执行者的具体细节,请求执行者也不知道请求发起者的具体细节,他们。我们可以看到,在这个过程中,方法执行者和方法调用者耦合在。是在一个类中定义这些方法,这个类被认为是方法执行者。了一起,如果方法执行者发生修改,例如方法名称变更,就会直接导致。

2024-03-13 17:18:11 554

原创 建造者模式--学习理解

6) 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,5) 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间。同样是创建型模式,抽象工厂模式并不关心产品本身的构建过程,只关心什么产品。2.实现创建过程和产品本身的解耦,使得相同的创建过程,因为参数。由什么工厂生产,即抽象工厂模式创建的产品是批量,事先定制完毕的,属于是。的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。4.增加新的具体建造者无须修改原有类库的代码,指挥者类针对。

2024-03-13 17:17:39 301

原创 桥接模式--学习理解

后期如果需要增加一个类型的手机,只需要关系新建一个手机类,就。手机类不再实现品牌接口,类相似的类,或者这个类本身并不实现接口,而是交给子类实现,同样有。需求建立很多相似的子类,例如手机类型和品牌的组合问题。分析:手机类实现品牌接口的方式,因为对于手机类来说,品牌。直接实现品牌接口,那就是将抽象的品牌和具体的手机实现放在了同一个。实现这种效果的核心在于修改了类和类的关系,将继承修改为了。是不确定的抽象概念,而手机类的内部代码是具体的实现。如果需要增加一个品牌,就只需要新增一个类实现品牌接口。

2024-03-13 17:16:48 308

原创 适配器模式--学习理解

但是,我们都知道,Controller内方法的返回值是具有多样性的,我们。方法,很有可能需要修改dispatch代码,来保证能够正常处理,这显然不符合。当我们无法直接调用被适配类的方法来完成任务,例如被适配类方法。调用适配类的方法来实现这些方法,在适配器内部完成需要的转化,适配器模式的核心作用就是解决类和类之间的兼容性问题,并达到解耦。我们就可以定义一个抽象类,这个抽象类对所有的适配方法进行空方法实现,通过设置不同的接口适配器,来。分类处理网络请求,例如资源访问请求,逻辑处理请求,并由适配器负责将。

2024-03-13 17:15:56 315

原创 Git常用命令:

Git confing [--global] key value 修改仓库的配置信息(config文件)想要进行所有仓 库的修改,可以加上--global 例如:username,useremail。2.前往gitee网站,进入当前用户的设置,在安全设置添加SSH公钥,对于部署了SSH 公钥电脑,在每次向指定仓库推送的时候可以不用输入密码,避免了密码在网络中的传 输,保证了安全性。Git push 远程仓库 本地分支名 将本地仓库分支的提交推送到远程服务器的指定分支。

2023-10-22 23:15:35 25 1

原创 Git分支操作,合并操作原理

由于整个项目的文件状态信息(进度)是以master分支所指向的1号文件引用的2号文件为准,所以当master分支选择合并user分支时,实际上就是根据master分支间接引用的2号文件和user分支间接引用的2号分支形成一次合并提交,产生新的1号文件和2号文件,而master分支和user分支就会指向同一个1号文件,从而完成一次完整的合并操作。而代表分支的文件则记录了当前分支所指向的1号文件,根据1号文件对应的2号文件就能够确定当前分支工作进度下所有文件的状态。

2023-10-22 20:28:49 80 1

原创 Git版本控制概念以及部分原理

2.版本控制软件的比对功能提供忽略某个文件,或者某个类型文件的作用,因为不是所有修改的文件都需要上传到远程服务器,例如本地的一些测试文件。相较于集中式版本控制,引入了本地服务器的概念,通过和中央服务器进行资源同步,一定程度上避免了中央服务器宕机带来的问题。1.版本控制软件的比对功能仅限于文本文件,对于其他类型的文件无法校验出具体修改了什么内容,只能检测出是否发生修改。版本: 1.软件版本 2.文件版本(保存重要的历史记录,恢复原有数据)总结:二者的作用都是为了更好的服务多人协作开发。

2023-10-22 19:09:00 27

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除