- 博客(42)
- 收藏
- 关注
转载 创建线程那么容易,为什么非要让我使用线程池?(深深深入剖析)
一、概述1、问题先看我们遇到的问题:我们创建线程的方式很简单,new Thread(() -> {…}),就是因为这么简单粗暴的方式,才带来了致命的问题。首先线程的创建和销毁都是很耗时很浪费性能的操作,你用线程为了什么?为了就是异步,为了就是提升性能。简单的new三五个Thread还好,我需要一千个线程呢?你也for循环new1000个Thread吗?用完在销毁掉。那这一千个线程的创建和销毁的性能是很糟糕的!2、解决为了解决上述问题,线程池诞生了,线程池的核心思想就是:线程复用。也就是说
2020-07-11 17:30:23
307
原创 了解Java8新特性,看这个就够了!
了解Java8新特性,看这个就够了!并行流与串行流并行流:就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。相比较串行的流,并行的流可以很大程度上提高程序的执行效率。Java8中将并行进行了优化,使我们可以很容易的对数据进行并行操作。Stream API可以声明性的通过parallel()与sequential()在并行与顺序流之间进行切换。Lambda表达式Lambda是一个匿名函数,可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出
2020-07-08 09:36:45
506
原创 Spring怎么实现事务?
Spring怎么实现事务?什么是事务?事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。为什么要事
2020-06-22 22:43:14
6223
原创 RocketMQ实现可靠消息最终一致性
RocketMQ实现可靠消息最终一致性业务说明本实例通过RocketMQ中间件实现可靠消息最终一致性分布式事务,模拟两个账户的转账交易过程。两个账户在分别在不同的银行(张三在bank1、李四在bank2),bank1、bank2是两个微服务。交易过程是,张三 给李四转账指定金额。上述交易步骤,张三扣减金额与给bank2发转账消息,两个操作必须是一个整体性的事务。程序组成部分数据库:MySQL-8.X (包括bank1和bank2 两个数据库)JDK:1.8.X微服务框架:SpringBo
2020-06-21 14:15:21
1501
1
原创 分布式事务解决方案-可靠消息最终一致性
分布式事务解决方案之可靠消息最终一致性什么是可靠消息最终一致性事务可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息,事务参与方(消息消费者)一定能 够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一致。 此方案是利用消息中间件完成,如下图: 事务发起方(消息生产方)将消息发给消息中间件,事务参与方从消息中间件接收消息,事务发起方和消息中间件 之间,事务参与方(消息消费方)和消息中间件之间都是通过网络通信,由于网络通信的不确定性会导致分布式事 务问题。
2020-06-20 17:49:02
563
原创 Hmily实现TCC事务
Hmily实现TCC事务业务说明本实例通过Hmily实现ICC分布式事务,模拟两个账户的转账交易过程。两个账户分别在不同的银行(张三在bank1、李四在bank2) , bank1. bank2是两个微服务。 交易过程是,张三给李四转账指定金额。上述交易步骤,要么一起成功,要么一起失败,必须是一个整体性的事务。程序组成部分数据库:MySQL-8.X (包括bank1和bank2 两个数据库)JDK:1.8.X微服务框架:SpringBoot2.3、SpringCloudHoxtonHm
2020-06-20 09:37:52
483
原创 分布式事务解决方案-TCC
分布式事务解决方案-TCC什么是TCC事务TCC是Try、Confirm、Cancel三个词的缩写,TCC要求每个分支事务实现三个操作,预处理Try、确认Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反得cao操作的回滚操作。TM首先先发起所有的分支事务的try操作,任何一个分支事务的Try操作执行失败,TM将会发起所有的分支事务的Cancel操作,若Try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Co
2020-06-19 11:01:04
250
原创 Seata实现2PC事务
Seata实现2PC事务业务说明通过Seata中间件实现分布式事务,模拟三个账户转账交易过程。两个账户在两个不同的银行(张三在bank1,李四在bank2),bank1与bank2是 两个微服务,交易过程是张三给李四转账指定金额上述交易步骤,要么一起成功,要么一起失败,必须在一个整体性的事务。##程序组成部分数据库:MySQL-8.X (包括bank1和bank2 两个数据库)JDK:1.8.X微服务框架:SpringBoot2.3、SpringCloudHoxtonSeata客户端(R
2020-06-18 23:28:05
293
原创 分布式事务解决方案-2PC
分布式事务解决方案-2PC什么是2PC2PC 即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(Commit phase),2是指俩个阶段,P是准别阶段,C是提交阶段。举例:张三李四好久不见面,约起来聚餐,饭店要求先买单,才能出票。这是张三李四,都不愿意请客,这时只能AA,只有他们都付款,老板才能出票安排就餐。但由于两人都是铁公鸡,形成了尴尬的一幕:准备阶段: 老板要求张三付款,张三付款。老板要求李四付款,李四付款。提交阶段:老板出票,安排就餐。例
2020-06-16 08:19:36
132
原创 事务基础篇
分布式事务事务基础篇什么是事务本地事务分布式事务分布式事务产生的场景分布式事务基础理论CAP理论CAP组合方式BASE理论理解强一致性和最终一致性BASE理论介绍事务基础篇什么是事务事务可以看作是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败!本地事务在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来完成的,因此叫做数据库事务,由于应用和数据库通常在一台服务器,所以基与关系型数据库的事务又被叫做本地事务。数据库事务的四大特性ACID:A
2020-06-15 10:59:07
197
原创 SpringMVC源码学习
SpringMVC源码学习SpringMVC的功能SpringMVC找Controller的流程DispatcherServlet的继承关系图doDispatch()方法的源码分析!SpringMVC的功能SpringMVC的最大功能就是请求分发,通过 请求地址(uri) 找到对应的Controller类方法的映射路径,执行对应的方法。那么就有两个问题首先得找到Controller 对...
2020-03-15 14:57:47
121
原创 设计模式——模板方法模式
在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单、吃东西、买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单。在这三个步骤中,点单和买单大同小异,最大的区别在于第二步——吃什么?吃面条和吃满汉全席可大不相同,如图1所示:图1请客吃饭示意图在软件开发中,有时也会遇到类似的情况,某个方法的实现需要多个步骤(类似“请...
2020-02-27 19:26:45
472
原创 设计模式——策略模式
俗话说:条条大路通罗马。在很多情况下,实现某个目标的途径不止一条,例如我们在外出旅游时可以选择多种不同的出行方式,如骑自行车、坐汽车、坐火车或者坐飞机,可根据实际情况(目的地、旅游预算、旅游时间等)来选择一种最适合的出行方式。在制订旅行计划时,如果目的地较远、时间不多,但不差钱,可以选择坐飞机去旅游;如果目的地虽远、但假期长、且需控制旅游成本时可以选择坐火车或汽车;如果从健康和环保的角度考虑,而且...
2020-02-26 22:22:43
832
原创 设计模式——状态模式
“人有悲欢离合,月有阴晴圆缺”,包括人在内,很多事物都具有多种状态,而且在不同状态下会具有不同的行为,这些状态在特定条件下还将发生相互转换。就像水,它可以凝固成冰,也可以受热蒸发后变成水蒸汽,水可以流动,冰可以雕刻,蒸汽可以扩散。我们可以用UML状态图来描述H2O的三种状态,如图1所示:在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同的状态下也将具有...
2020-02-26 22:02:02
510
原创 设计模式——观察者模式
观察者模式是设计模式中的“超级模式”,其应用随处可见。“红灯停,绿灯行”,在日常生活中,交通信号灯装点着我们的城市,指挥着日益拥挤的城市交通。当红灯亮起,来往的汽车将停止;而绿灯亮起,汽车可以继续前行。在这个过程中,交通信号灯是汽车(更准确地说应该是汽车驾驶员)的观察目标,而汽车是观察者。随着交通信号灯的变化,汽车的行为也将随之而变化,一盏交通信号灯可以指挥多辆汽车。如图22-1所示:...
2020-02-23 09:59:37
738
原创 设计模式——备忘录模式
每个人都有过后悔的时候,但人生并无后悔药,有些错误一旦发生就无法再挽回,有些人一旦错过就不会再回来,有些话一旦说出口就不可能再收回,这就是人生。为了不后悔,凡事我们都需要三思而后行。说了这么多,大家可能已经晕了,不是在学设计模式吗?为什么弄出这么一堆人生感悟来,呵呵,别着急,本章将介绍一种让我们可以在软件中实现后悔机制的设计模式——备忘录模式,它是软件中的“后悔药”,是软件中的“月光宝盒”。话不多...
2020-02-17 12:14:14
262
原创 设计模式——中介者模式
腾讯公司推出的QQ作为一款免费的即时聊天软件深受广大用户的喜爱,它已经成为很多人学习、工作和生活的一部分(不要告诉我你没有QQ哦,)。在QQ聊天中,一般有两种聊天方式:第一种是用户与用户直接聊天,第二种是通过QQ群聊天,如图20-1所示。如果我们使用图20-1(A)所示方式,一个用户如果要与别的用户聊天或发送文件,通常需要加其他用户为好友,用户与用户之间存在多对多的联系,这将导致系统中用户之间的关...
2020-02-16 11:32:27
802
原创 设计模式——迭代器模式
20世纪80年代,那时我家有一台“古老的”电视机,牌子我忘了,只记得是台黑白电视机,没有遥控器,每次开关机或者换台都需要通过电视机上面的那些按钮来完成,我印象最深的是那个用来换台的按钮,需要亲自用手去旋转(还要使点劲才能拧动),每转一下就“啪”的响一声,如果没有收到任何电视频道就会出现一片让人眼花的雪花点。当然,电视机上面那两根可以前后左右移动,并能够变长变短的天线也是当年电视机的标志性部件之一,...
2020-02-09 17:47:59
391
原创 设计模式——解释器模式
虽然目前计算机编程语言有好几百种,但有时候我们还是希望能用一些简单的语言来实现一些特定的操作,我们只要向计算机输入一个句子或文件,它就能够按照预先定义的文法规则来对句子或文件进行解释,从而实现相应的功能。例如提供一个简单的加法/减法解释器,只要输入一个加法/减法表达式,它就能够计算出表达式结果,当输入字符串表达式为“1 + 2 + 3 – 4 + 1”时,将输出计算结果为3。我们知道,像C++...
2020-02-09 14:08:57
201
原创 设计模式——命令模式
装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或者排气扇。在购买开关时,我们并不知道它将来到底用于控制什么电器,也就是说,开关与电灯、排气扇并无直接关系,一个开关在安装之后可能用来控制电灯,也可能用来控制排气扇或者其他电器设备。开关与电器之间通过电线建立连接,如果开关打开,则电线通电,电器工作;反之,开关关闭,电线断电,电器停止工作。相同的开关可以通过不...
2020-02-07 10:29:58
371
原创 设计模式——职责链模式
“一对二”,“过”,“过”……这声音熟悉吗?你会想到什么?对!纸牌。在类似“斗地主”这样的纸牌游戏中,某人出牌给他的下家,下家看看手中的牌,如果要不起上家的牌则将出牌请求再转发给他的下家,其下家再进行判断。一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新的牌。在这个过程中,牌作为一个请求沿着一条链在传递,每一位纸牌的玩家都可以处理该请求。在设计模式中,我们也有一种专门用于处理这种请求...
2020-02-06 00:59:19
162
原创 设计模式——代理模式
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问...
2020-02-04 10:09:00
404
原创 设计模式——享元模式
当前咱们国家正在大力倡导构建和谐社会,其中一个很重要的组成部分就是建设资源节约型社会,“浪费可耻,节俭光荣”。在软件系统中,有时候也会存在资源浪费的情况,例如在计算机内存中存储了多个完全相同或者非常相似的对象,如果这些对象的数量太多将导致系统运行代价过高,内存属于计算机的“稀缺资源”,不应该用来“随便浪费”,那么是否存在一种技术可以用于节约内存使用空间,实现对这些相同或者相似对象的共享访问呢?答案...
2020-01-28 15:06:20
233
原创 设计模式——外观模式
外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。外观模式概述不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶、茶具和开水,如图1(A)所示,而去茶馆喝茶,最简单的方式就是跟茶馆服务员说想要一杯什么样的茶,是铁观音、碧...
2020-01-16 16:57:10
308
原创 设计模式——装饰模式
尽管目前房价依旧很高,但还是阻止不了大家对新房的渴望和买房的热情。如果大家买的是毛坯房,无疑还有一项艰巨的任务要面对,那就是装修。对新房进行装修并没有改变房屋用于居住的本质,但它可以让房子变得更漂亮、更温馨、更实用、更能满足居家的需求。在软件设计中,我们也有一种类似新房装修的技术可以对已有对象(新房)的功能进行扩展(装修),以获得更加符合用户需求的对象,使得对象具有更加强大的功能。这种技术对应于一...
2020-01-10 16:53:44
163
原创 设计模式——组合模式
树形结构在软件中随处可见,例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点(包含子节点的节点)。下面将学习这种用于处理树形结构的组合模式。设计...
2020-01-09 16:43:51
143
原创 设计模式——桥接模式
在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔。假如我们需要大中小3种型号的画笔,能够绘制12种不同的颜色,如果使用蜡笔,需要准备3×12 = 36支,但如果使用毛笔的话,只需要提供3种型号的毛笔,外加12个颜料盒即可,涉及到的对象个数仅为 3 + 12 = 15,远小于36,却能实现与36支蜡笔同样的功能。如果增加一种新型号的画笔,并且也需要具有12种颜色,对应的蜡...
2020-01-07 17:47:51
545
原创 设计模式——适配器模式
我的笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源适配器,生活用电和笔记本电脑即可兼容,如图9-1所示:图9-1电源适配器示意图 在软件开发中,有时也存在类似这种不兼容的情况,我们也可以像引入一个电源适配器一样引入一个称之为适...
2020-01-05 18:02:14
191
原创 设计模式——建造者模式
没有人买车会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整汽车。如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需要解决的问题。建造者模式又称为生成器模式,它是一种较为复杂、使用频率也相对较低的创建型模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。游戏角色设计 Sunny软件公司游戏开发...
2020-01-02 15:33:17
405
2
原创 设计模式——原型模式
张纪中版《西游记》以出乎意料的造型和雷人的台词遭到广大观众朋友的热议,我们在此对该话题不作过多讨论。但无论是哪个版本的《西游记》,孙悟空都是其中的一号雄性主角,关于他(或它)拔毛变小猴的故事几乎人人皆知,孙悟空可以用猴毛根据自己的形象,复制(又称“克隆”或“拷贝”)出很多跟自己长得一模一样的“身外身”来。在设计模式中也存在一个类似的模式,可以通过一个原型对象克隆出多个一模一样的对象,该模式称之为原...
2019-12-27 17:03:57
296
原创 设计模式——单例模式
单例模式的动机对于一个软件系统的某些类而言,我们无须创建多个实例。举个大家都熟知的例子——Windows任务管理器,如图3-1所示,我们可以做一个这样的尝试,在Windows的“任务栏”的右键弹出菜单上多次点击“启动任务管理器”,看能否打开多个任务管理器窗口?如果你的桌面出现多个任务管理器,我请你吃饭(注:电脑中毒或私自修改Windows内核者除外)。通常情况下,无论我们启动任务管...
2019-12-26 16:36:51
116
原创 设计模式——抽象工厂模式
工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是我们本文将要学习的抽象工厂模式的基本思想。界面皮肤库的初始设计 Sunny软件公司欲开发一套界面皮肤库,可以...
2019-12-26 13:54:46
126
原创 设计模式——工厂方法模式
简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响已有代码?工厂方法模式应运而生,本文将介绍第二种工厂模式——工厂方法模式。日志记录器的设计 Sunny软件公司欲开发一个系统运行日志记录器(Logger),该记录器可以...
2019-12-23 18:12:08
178
原创 设计模式——简单工厂模式
工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于GoF 23种设计模式,但在软件开发中应用也较为频繁,通常将它作为学习其他工厂模式的入门。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。这三种工厂模式各具特色,难度也逐个加大,在软件开发中它们都得到了广泛的应用,成为面向对象软...
2019-12-23 13:19:05
132
原创 设计模式——合成复用原则
合成复用原则的定义合成复用原则(Composite Reuse Principle,CRP)又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)。它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭...
2019-11-23 23:27:36
175
原创 设计模式——迪米特法则
迪米特法则的定义迪米特法则(Law of Demeter,LoD)又叫作最少知识原则(Least Knowledge Principle,LKP),产生于 1987 年美国东北大学(Northeastern University)的一个名为迪米特(Demeter)的研究项目,由伊恩·荷兰(Ian Holland)提出,被 UML 创始者之一的布奇(Booch)普及,后来又因为在经典著作《程序员...
2019-11-23 23:10:46
154
原创 设计模式——单一职责原则
单一职责原则的定义单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,由罗伯特·C.马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than on...
2019-11-23 18:41:27
172
原创 设计模式——接口隔离原则
接口隔离原则的定义接口隔离原则(Interface Segregation Principle,ISP)要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。2002 年罗伯特·C.马丁给“接口隔离原则”的定义是:客户端不应该被迫依赖于它不使用的方法(Clients sh...
2019-11-23 18:13:18
136
原创 设计模式——依赖倒置原则
依赖倒置原则的定义依赖倒置原则(Dependence Inversion Principle,DIP)是 Object Mentor 公司总裁罗伯特·马丁(Robert C.Martin)于 1996 年在C++Report 上发表的文章。依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level module...
2019-11-20 22:22:41
280
原创 设计模式——里氏替换原则
里氏替换原则的定义里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立(Inheri...
2019-11-20 16:53:30
322
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人