- 博客(107)
- 收藏
- 关注
原创 虚拟机栈
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的【如果设计成基于寄存器的,耦合度高,性能会有所提升,因为可以对具体的CPU架构进行优化,但是跨平台性大大降低】。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。具体问题具体分析如果只有一个线程才可以操作此数据,则必是线程安全的。如果有多个线程操作此数据,则此数据是共享数据。如果不考虑同步机制的话,会存在线程安全问题。
2023-01-08 16:27:35
756
原创 JVM-运行时数据区
当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区。
2022-08-24 20:43:22
192
原创 JVM-类加载子系统
System . out . println("你的大恩大德,我下辈子再报!");} }它的加载过程是怎么样的呢?执行 main() 方法(静态方法)就需要先加载main方法所在类 HelloLoader加载成功,则进行链接、初始化等操作。完成后调用 HelloLoader 类中的静态方法 main加载失败则抛出异常完整流程JVM严格来讲支持两种类型的类加载器。...
2022-08-09 16:54:51
248
原创 JVM初步介绍
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
2022-08-08 19:51:23
112
原创 接口幂等性操作
接口幂等性概念存在的问题接口幂等性什么情况下需要保证接口的幂等性哪些场景需要做幂等性操作幂等性的措施Token机制各种锁机制数据库悲观锁数据库乐观锁业务层分布式锁概念存在的问题现如今我们的系统大多拆分为分布式SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务,而服务调用服务无非就是使用RPC通信或者restful,既然是通信,那么就有可能在服务器处理完毕后返回结果的时候挂掉,这个时候用户端发现很久没有反应,那么就会多次点击按钮,这样请求有多次,那么处理数据的结果
2022-02-18 16:30:54
216
原创 rabbitMQ的进阶使用
rabbitMQ的进阶使用(生产者发布消息与消费者订阅消息)整合rabbitMQ实现服务端的消息抵达通知测试接受消息服务器端消息发送整合rabbitMQ首先整合rabbitMQ 需要的初步参考初步使用rabbitMQ实现服务端的消息抵达通知我们现在对配置文件进行修改 # RabbitMQ配置 rabbitmq: host: 123.57.234.28 port: 5672 # 虚拟主机配置 virtual-host: / publisher-retu
2022-02-14 14:57:33
1126
原创 rabbitMQ初步使用
rabbitMQ初步使用整合springbootrabbitMQ简介MQ简介为什么要使用MQ应用方式协议AMQP 与 JMS 区别rabbitMQ简介核心概念rabbitMQ在liunx安装整合springboot初步测试rabbitMQ简介MQ简介MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。多用于分布式系统之间进行通信。为什么要使用MQ在没使用MQ之前可能需要对多个操作进行同步异步的操作,例如下图,在每项操作完成之后才能返回执行结果。这样会造成大量请求下
2022-01-30 11:17:03
267
原创 谷粒商城高级篇-sso单点登录
单点登录单点登录介绍sso思路流程开源框架xxl-sso实现原理源码分析客户端代码分析回到第二层代码服务端代码分析其他客户端登录单点登录介绍基于spring session 的方式只能解决session在同域或者是同服务的session共享问题。但是无法解决不同域名之前的共享问题,因此我们需要一台认证服务器。sso思路sso思路记住一个核心思想:建议一个公共的登陆点server,他登录了代表这个集团的产品就登录过了流程有两个子系统app1、app2登录app1用户访问app1系统,ap
2022-01-09 17:22:15
1505
原创 谷粒商城高级篇——session一致性解决方案(SpringSession)
session一致性解决方案问题描述解决方案session复制session存储在客户端hash一致性算法统一存储(中间件存储)集成SpringSession集成文档核心原理代码问题描述由于现在服务都是分布式的,且域名存在多个。各个系统之前的信息可能需要保持一致(存在跨域名和跨服务甚至是多个同一服务的不同机器session一致性问题),通过原始session的存储方式必然产生信息缺失问题。解决方案session复制多个服务之间用session同步技术共享(例如 tomcat 可以共享sessio
2022-01-02 20:26:21
1491
1
原创 谷粒商城高级篇(39)——认证服务之验证码注册
认证服务之验证码注册说明需求梳理技术点发送验证码准备集成第三方短信服务gulimall-api(第三方服务模块)com.xfwang.gulimall.api.component.SmsComponentcom.xfwang.gulimall.api.controller.SmsSendControllerapplication.yaml认证服务注册会员说明需求梳理这块功能主要是,在商城的注册页面,需要后台提供一个发送验证码校验的注册功能,主要涉及发送验证码设置时限性,验证通过会员模块注册用户技术点
2021-12-17 16:21:04
2342
1
原创 谷粒商城高级篇(38)——异步编排之商品详情查询
异步编排之商品详情查询异步编排CompletableFuture介绍创建异步对象计算完成时回调方法handle 方法线程串行化方法两任务组合全部完成一个完成即可多任务组合业务描述代码准备工作gulimall-productapplication.yml业务代码ItemControllerSkuInfoServiceSkuInfoServiceImpl异步编排CompletableFuture介绍Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成,
2021-12-14 15:55:01
567
原创 谷粒商城高级篇(37)——线程池的使用
线程池的使用线程池基本使用初始化线程的4种方式线程池构造参数介绍拒绝策略为什么阿里开发手册不允许使用常见线程池FixedThreadPoolSingleThreadExecutorCacheThreadPoolScheduledThreadPool线程池基本使用初始化线程的4种方式继承Thread实现Runnable接口实现Callable接口 + FutureTask (可以拿到返回结果,可以处理异常)线程池方式1和方式2:主进程无法获取线程的运算结果。不适合当前场景方式3:主进程可以
2021-12-13 21:56:12
920
原创 访问者模式
访问者模式1.1 概述定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。1.2 结构访问者模式包含以下主要角色:抽象访问者(Visitor)角色:定义了对每一个元素(Element)访问的行为,它的参数就是可以访问的元素,它的方法个数理论上来讲与元素类个数(Element的实现类个数)是一样的,从这点不难看出,访问者模式要求元素类的个数不能改变。具体访问者(ConcreteVisitor)角色:给出对每一个元素类访问时所产生的具
2021-12-08 19:35:57
199
原创 解释器模式
解释器模式1.1 概述如上图,设计一个软件用来进行加减计算。我们第一想法就是使用工具类,提供对应的加法和减法的工具方法。//用于两个整数相加public static int add(int a,int b){ return a + b;}//用于两个整数相加public static int add(int a,int b,int c){ return a + b + c;}//用于n个整数相加public static int add(Integer ... a
2021-12-08 19:31:20
182
原创 备忘录模式
备忘录模式2.1 概述备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 浏览器 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。定义:又叫快照模
2021-12-08 19:26:08
240
原创 迭代器模式
迭代器模式1.1 概述定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。1.2 结构迭代器模式主要包含以下角色:抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。具体迭代器(Concretelte
2021-12-08 19:19:02
194
原创 中介者模式
中介者模式1.1 概述一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中,有六个同事类对象,假如对象1发生变化,那么将会有4个对象受到影响。如果对象2发生变化,那么将会有5个对象受到影响。也就是说,同事类之间直接关联的设计是不好的。如果引入中介者模式,那么同事类之间的关系将变为星型结构,从下右图中可以看到,任何一个类的变动,只会影响的类本身,以及中介者,这样就减小了系统的耦合。一个好
2021-12-08 19:04:13
200
原创 设计模式之观察者模式
观察者模式1.1 概述定义:又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。1.2 结构在观察者模式中有如下角色:Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。ConcreteSubject:具体主题(具体被观察者
2021-12-08 18:57:42
186
原创 状态模式
概述【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。类图如下:代码如下:public interface ILift { //电梯的4个状态 //开门状态 public final static int OPENING_STATE = 1; //关门状态 public fi
2021-09-05 23:04:03
187
原创 谷粒商城之SpringCache
概述spring从3.1开始定义了Cache、CacheManager接口来统一不同的缓存技术。并支持使用JCache(JSR-107)注解简化我们的开发Cache接口的实现包括RedisCache、EhCacheCache、ConcurrentMapCache等每次调用需要缓存功能的方法时,spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。使用Spring缓存抽象时我们需要关
2021-09-01 23:01:44
222
转载 责任链模式
概述在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难度。这样的例子还有很多,如找领导出差报销、生活中的“击鼓传花”游戏等。定义:又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条
2021-09-01 15:25:28
152
转载 命令模式
概述日常生活中,我们出去吃饭都会遇到下面的场景。定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。结构命令模式包含以下主要角色:抽象命令类(Command)角色: 定义命令的接口,声明执行的方法。具体命令(Concrete Command)角色:具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。实现者/接收者(Receiver)角色: 接收者,
2021-09-01 14:43:21
164
转载 策略模式
概述先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发,也可以使用eclipse进行开发,也可以使用其他的一些开发工具。定义: 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管
2021-09-01 14:27:18
245
转载 模板方法模式
概述在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。定义:定义一个操作中的算法骨架,而将算法的一些步骤延迟
2021-08-31 21:11:16
153
原创 谷粒商城高级篇——商品分类使用redission
Redissongulimall-redispom.xml<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.13.4</version></dependency>gulimall-productMyRedisConfig.java@Configu
2021-08-29 14:18:47
491
原创 缓存和分布式锁
缓存缓存使用为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问。而 db 承担数据落盘工作。哪些数据适合放入缓存? 即时性、数据一致性要求不高的 访问量大且更新频率不高的数据(读多,写少)举例:电商类应用,商品分类,商品列表等适合缓存并加一个失效时间(根据数据更新频率来定),后台如果发布一个商品,买家需要 5 分钟才能看到新的商品一般还是可以接受的。伪代码实现data = cache.load(id);//从缓存加载数据If(data == null){data = d
2021-08-29 12:59:09
248
原创 谷粒商城高级篇——商品分类使用redis本地缓存设计
业务分析对于访问商品首页的时候需要去后台去访问商品的分类数据,是一个树形结构的json,这种数据我们把它加入缓存中提升页面的加载速度导入依赖gulimall-redis模块这里我建议抽离出一个redis的模块,或者将redis的依赖导出common模块中,后期可以为其他服务调用复用,并且可以使用工具类封装redis的一些常用操作pom.xml<!-- redis --><dependency> <groupId>org.springframework.b
2021-08-28 22:34:03
953
原创 享元设计模式
概述定义: 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。结构享元(Flyweight )模式中存在以下两种状态:内部状态,即不会随着环境的改变而改变的可共享部分。外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。享元模式的主要有以下角色:抽象享元角色(Flyweight):通常是一个接口或抽象类,在抽象享元类中声明
2021-08-27 15:54:28
201
转载 组合型模式
概述对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象。但是由于容器对象和叶子对象在功能上面的区别,使得我们在使用的过程中必须要区分容器对象和叶子对象,但是这样就会给客户带来不必要的麻烦,作为客户而已,它始终希望能够一致的对待容器对象和叶子对象。定义:
2021-08-27 15:04:10
396
转载 外观设计模式
概述有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机构收取一定比例的托管管理费用。定义: 又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部
2021-08-26 17:04:32
158
转载 桥接设计模式
概述现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。定义: 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维
2021-08-26 16:27:33
145
转载 装饰者模式
概述我们先来看一个快餐店的例子。快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得比较麻烦。使用继承的方式存在的问题:扩展性不好如果要再加一种配料(火腿肠),我们就会发现需要给FriedRice和FriedNoodles分别定义一个子类。如果要新增一个快餐品类(炒河粉)的话,就需要定义更多的子类。产生过多的子类定义: 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外
2021-08-26 16:12:37
158
原创 性能与压力测试
性能监控jvm 内存模型程序计数器 Program Counter Register:■记录的是正在执行的虚拟机字节码指令的地址,■此内存区域是唯 个在JAVA虚拟机规范中没有规定任何OutOfMemoryError的区域虚拟机:VM Stack■描述的是JAVA方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧, 用于存储局部变量表,操作数栈,动态链接,方法接口等信息■局部变量表存储了编译期可知的各种基本数据类型、对象引用■线程请求的栈深度不够会报StackOverflowErr
2021-08-24 23:29:35
770
1
转载 适配器模式
概述如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供我们充电,这样使得我们的插头在当地能使用。生活中这样的例子很多,手机充电器(将220v转换为5v的电压),读卡器等,其实就是使用到了适配器模式。定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类适配器模式和对象适配器模式,
2021-08-24 21:38:02
175
原创 代理设计模式
概述由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成,而动态代理代理类则是在Java运行时动态生成。动态代理又有JDK代理和CGLib代理两种。结构代理(Proxy)模式分为三种角色:抽象主题(Subject)类: 通过接口或抽象类声明真实主题和代理对象实现的业务方法。真实主题(Real Subject)类
2021-08-23 22:02:13
252
转载 建造者模式
概述将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型
2021-08-23 15:35:28
166
原创 原型设计模式
概述用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。结构原型模式包含如下角色:抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。访问类:使用具体原型类中的 clone() 方法来复制新的对象。接口类图如下:实现原型模式的克隆分为浅克隆和深克隆。浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。深克
2021-08-22 23:15:33
221
原创 抽象工厂模式
前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、传智播客只培养计算机软件专业的学生等。这些工厂只生产同种类产品,同种类产品称为同等级产品,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。本节要介绍的抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,下图所示横轴是产品等级,也就是同
2021-08-06 18:36:13
297
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人