自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 资源 (3)
  • 收藏
  • 关注

原创 浅谈模式 - 汇总篇

本篇只是总结下各个设计模式要表达的核心思想。算是我的笔记。创建型单例对于某个类,在进程级别只允许一个实例存在。当然还有多进程间共享单例(一般也不常用)或者线程级别的单例。实现方式:① 恶汉式(最常见,最简单)② 懒汉式(双重检测,为防止指令冲排序,加上volatile)③ 静态内部类(内部类是要在用到时候才加载)④ 使用Enum来实现(反正我是没用过)工场简单工场(使用puli...

2020-05-06 22:08:05 250

原创 优雅代码汇总篇

开篇废话这么多年一直在写Java代码。在编码规范和代码优雅问题上一直都有自己的一套理论,脑中有大量有型的案例。习惯在周末的时候独自在家大批量的重构项目中的代码,看到不规范的代码就有要修改它的冲动。对代码有洁癖,也喜欢重构。一个周末重构上百个类,真的挺爽的。重构的多了,觉得挺没意思,因为感觉都在重复同样的工作,都不用动脑子,重构的过程感觉是在休息和偷懒。。。从理性上,我觉得把代码写好看,注意是要...

2020-05-05 16:36:48 1163

原创 排序10G的大文件

一个文件,大小10G,里面都是用逗号分隔的整型数字。怎么排序?文件大概张这个样子。这个问题的麻烦显然是『大』,多大算大 ,10G,100G,1000G,显然不能考虑直接使用内存来搞。很显然,分治思维是必然的,需要拆分文件。直接说下思路,然后上代码。1.把10G大小的文件拆分成N个小文件,每个文件1M2.把每个文件拉倒内存排序,可以并行操作,在内存中直接使用快排,然后写入文件3.对文件做两两合并。前两步都好办,代码也好写。第3步文件合并,需要考虑几个问题。① 2个1M的有序文件怎么合并?先

2020-07-08 19:08:24 2497

转载 JVM指令集

网上找的没有指令码这列  自己把它加上 更方便查阅 指令从0x00-0xc9 没有0xba常量入栈指令指令码操作码(助记符)操作数描述(栈指操作数栈)0x01aconst_null  null值入栈。0x02iconst_m1  -1(int)值入栈。...

2020-05-14 12:35:48 308 1

原创 CyclicBarrier原理分析

CyclicBarrier循环的栅栏。使用上,与CountDownLatch类似,也不太一样。这两个类都是用来解决线程同步问题的。同步问题说的通俗一点就是线程间通信。CountDownLatch,是主线程等待所有子线程结束任务CyclicBarrier,是多个子线程互相等待下面看看CyclicBarrier的源码实现public CyclicBarrier(int parties, Runnable barrierAction) { if (parties <= 0) throw ne

2020-05-13 12:45:23 201

原创 LongAdder原理分析和性能测试

介绍LongAddr是JDK1.8才有的。其在高并发情况下,相比与AtomicLong的性能更高。本篇主要分析一下其实现原理。并且与AtomicLong做一个性能对比测试。AtomicLong利用CPU对CAS实现的原子化指令实现。public final long getAndAddLong(Object var1, long var2, long var4) { long var6; do { var6 = this.getLongVolatile(var1, va

2020-05-13 04:35:54 532 1

原创 浅谈模式 - 装饰者模式

对象包装对象,目的是功能增强。最常见的JAVA IO。Dubbo,Spring中都有一些wapper类。// 出自Dubbo源码 ProtocolFilterWrapper,版本2.6.4public class ProtocolFilterWrapper implements Protocol { private final Protocol protocol;// 被包装的p...

2020-05-08 03:30:16 154

原创 浅谈模式 - 责任链模式

过滤器链,拦截器链public interface IHandler { boolean doIt();}public class Handler1 implements IHandler { @Override public boolean doIt() { System.out.println("handler 1"); ret...

2020-05-08 03:29:31 154

原创 浅谈模式 - 享元模式

目的是共享内存中的某些对象资源比如棋类游戏,每个棋子可以作为共享资源public class Chess { private int id; private String text; private Color color; public Chess(int id, String text, Color color) { this.id = ...

2020-05-08 03:28:43 132

原创 浅谈模式 - 适配器模式

适配器,属于一种补偿模式,用于补偿原有设计的不足之处。adapter持有adaptee目标对象的委托,对其调用。或者继承关系。继承的方式public class Adaptee { public void method1() { System.out.println("目标方法"); }}public class Adapter extends Adap...

2020-05-08 03:28:00 156

原创 浅谈模式 - 模板方法

在抽象层方法中,定义一些列的行为骨架。并且设计好执行顺序(不变的流程)。具体的行为实现,由子类完成。几乎任何一个框架,任何系统在抽象层都要使用模板方法。因为框架的骨架由实体域,服务域,回话域三大块组成。服务域代表的就是流程,流程的控制基本都得用上模板方法。public interface ITemplate { void method1(); void method2();...

2020-05-08 03:26:52 127

原创 浅谈模式 - 观察者模式

两种角色. 1.观察者. 2.被观察者被观察这一般会持有一个观察者的列表。当某些相关事件发生之后,循环调用每个观察者触发其update行为。至于观察者的update行为怎么实现,被观察这不关心。这也体现了角色之前行为的解耦。他们的唯一耦合是观察者列表。public interface ISubject { void register(IObserver observer)...

2020-05-08 03:25:03 183

原创 浅谈模式 - 代理模式

真实动作的前面和后面分别做一些行为。真实动作使用委托的方式来调用。静态代理public interface Subject { void buyTicket();}public class SubjectImpl implements Subject { @Override public void buyTicket() { System.out...

2020-05-08 03:23:19 127

原创 浅谈模式 - 策略模式

在行为级别。把if else,switch替换掉的最好方式。策略类型的存放,有些人喜欢用static map,我喜欢用Enum,我感觉更优雅。Enum作为策略类型,实现类的beanId直接写到Enum中。今后的可扩展点就是新增或者删除实现类,并且对Enum作调整。这边的Enum就相当于是配置了。这边举一个简单的案例,比如要去上海旅游,有3中策略:跑去,开车,飞机。来看代码。public ...

2020-05-08 03:22:43 149

原创 浅谈模式 - 桥梁模式

桥梁模式,我觉得是比较难理解的一个模式,它的定义很简单:将抽象和实现解耦,让它们可以独立变化。深刻理解却不容易。网上有很多案例,但这个模式如果以Demo来聊,我觉得无法学到它的精髓。这边以Dubbo中Transporter层的设计来说说桥梁模式。这个模式比较隐晦,挺难理解的。什么是抽象,什么是实现?它这里面的抽象指的不是抽象类或者接口。实现也不是指的具体实现类。我这边来解释下Transport...

2020-05-07 23:35:25 200

原创 MyBatis中的设计模式

本篇聊一聊MyBatis所用到的一些设计模式。关于MyBatis一些实现原理,可以参考 MyBatis的Mapper机制1.工场模式关于工场模式的具体原理和实现可以参考 浅谈模式 - 工场模式SqlSessionFactorypublic interface SqlSessionFactory { SqlSession openSession(); SqlSession op...

2020-05-07 20:28:41 137

原创 MyBatis-Spring的Mapper机制

关于MyBatis本身的Mapper机制,请参考文档 MyBatis的Mapper机制首先,在没有使用MyBatis-Spring的情况下,我们这么去访问Mapperpublic Student findStudentById(int studentId) { SqlSession sqlSession = MyBatisUtil.getSqlSession(); try {...

2020-05-07 20:08:02 455

原创 MyBatis的Mapper机制

Mapper机制从流程上分为3个步骤1.启动时做初始化动作2.运行时使用getMapper方法生成动态代理3.调用sql执行过程Mapper机制初始化系统启动首先会初始化Configuration,我们从Configuration的初始化位置开始看。请先找到XMLConfigBuilder类。 public Configuration parse() { if (parsed...

2020-05-07 15:42:30 278

原创 浅谈模式 - 建造者模式

当某个类的参数过多,构造细节过于复杂时,使用builder模式。build()方法可以做一些参数有效性的校验工作不太好的地方:Builder类会把主类中的参数做一层冗余。这个在内部看来不太好看。也让人觉得不舒服。在外面用的时候确实比较爽。说明这样的爽是有代价的。建造者模式与工场模式的区别:① 建造者模式,重点关注在构造某个类的细节上② 工场模式,重点关注在产品的种类上一家必胜客,可以生产...

2020-05-07 14:56:41 135

原创 浅谈模式 - 工场模式

简单工场(使用pulic static T create/getInstance/valueOf(){},把创建对象的细节封装起来)工场方法(针对单一维度)public interface ITypeFactory { IType create();}public interface IType {}抽象工场(针对多个维度,不常用)public interface IType...

2020-05-07 14:52:45 120

原创 dubbo有哪些不好看的代码

拿Dubbo源码为案例,来说说什么样的代码是优雅的。以下案例所用Dubbo源码版本2.6.4。我先声明下哈,Dubbo是个好框架,我只是在鸡蛋里挑骨头,不是在指责它不好。1.反向思维,尽快结束原则我认为是方法或者函数最有指导价值的一个思想,放在第一个说。要达到反向思维,尽快结束目的,我总结下3种方式① if判断反写,尽快return或者throw(最简单,最实用)② 减少不必要的els...

2020-05-06 22:35:14 139

原创 浅谈模式 - 单例模式

说说我眼中的单例对于某个类,在进程级别只允许一个实例存在。当然还有多进程间共享单例(一般也不常用)或者线程级别的单例。实现方式:① 恶汉式② 懒汉式(双重检测,为防止指令冲排序,加上volatile)③ 静态内部类(内部类是要在用到时候才加载)④ 使用Enum来实现这个设计模式应该谁都懂,没必要多说。细节的资料网上太多。在大部分情况,我会选择恶汉式的实现方式,因为简单嘛,不用动脑子。...

2020-05-05 23:59:05 131

原创 优雅代码 - 业务层代码命名

优雅代码汇总篇不是谈帕斯卡,骆驼命名等问题。而是说说业务模块和技术模块的一些命名优劣。以订单模块为例,我会给出OrderService和OrderDao中一些基本的接口定义。下面先列出,我认为不太友好的服务接口定义方式:// 我先给出DAO的定义,这个DAO的定义没有问题的,主要看下面的OrderService的定义public interface OrderDao { // 根...

2020-05-05 16:44:56 1375

原创 优雅代码 - 说说this

优雅代码汇总篇不是想说this的用法特点,而是想说对私有方法调用时,希望可以加上this关键字。有助于后期代码的阅读。当然,这只是我的个人习惯和观点。说说为什么,来看看代码。// Dubbo 源码,DefaultFuture.setCallback// invokeCallback是一个私有方法,但是我第一眼看这个方法,无法直接明白那行代码在调用一个私有方法,我会考虑它可能是本类的方法,或者...

2020-05-05 16:44:14 162

原创 优雅代码 - 善用Enum

优雅代码汇总篇Enum真的是个好东西,香。用enum + spring实现策略模式在实际的项目中,一定会碰到很多需要需要横向扩展的场景,比如:技术方面的,Dubbo的负载均衡策略,协议策略,序列化策略等等。业务方面的,支付策略(支付宝,微信,余额),登录策略(用户名密码,验证码)。这些场景都是在一定范围内可以枚举,并且需要有横向扩展的能力,需要符合开闭原则。Dubbo用了自己的SPI,目的...

2020-05-05 16:43:20 238

原创 优雅代码 - 其他案例分析

优雅代码汇总篇一些随机抽取的案例案例1(没有必要的hash浪费)// Dubbo 源码,SimpleDataStore.get// 如果containsKey为true,则会出现2次hash操作(containsKey一次,get操作再一次)。浪费public Object get(String componentName, String key) { if (!data.co...

2020-05-05 16:42:10 133

原创 优雅代码 - 减少累赘的代码

优雅代码汇总篇Java足够严谨,但是不够简洁,想要把Java代码写的优雅,不要写费代码,不要拖沓。看案例案例1(适当使用三目运算)// Dubbo 源码,URL构造方法public URL(String protocol, String username, String password, String host, int port, String path, Map<String...

2020-05-05 16:41:21 208

原创 优雅代码 - 反向思维尽快结束

优雅代码汇总篇要达到反向思维,尽快结束目的,我总结下3种方式① if判断反写,尽快return或者throw(最简单,最实用)② 减少不必要的else,能不用则不用③ 在循环中多使用break,continue等流程控制方式案例1(if反写,多用流程控制语句)// Dubbo 源码,RegistryDirectory.destroyUnusedInvokers// 这个方法干了啥?...

2020-05-05 16:40:31 186

原创 dubbo中的HttpServer

先看下Protocol的类结构Dubbo默认使用DubboProtocol,但也可以使用Http,Rest,Hessian,WebService这几种协议来发布和引入服务。这几种协议都基于HTTP。所以必然要发布HTTP接口。在dubbo的exchange层这篇文章中介绍到。Exchange层最主要的功能是构建了Request和Response的抽象,因为它要在TCP协议上做自定报文结构。所...

2020-05-03 19:42:55 291

原创 dubbo微服务之间流水号的隐式传递

什么是流水号?做开发的人都知道流水号这个概念,有业务流水号,交易流水号,请求流水号等等,各种流水号。无论是啥名字的流水号,目的都是为了在某个维度,让一系列动作有一个唯一的标识。后面方便查日志,查问题。系统间交互可以防止扯皮。比如交易流水号,唯一标识一笔交易,这边所说的交易可以是无业务含义的请求,也可以是账务交易。如果是标识无业务含义的请求。一般会在交易开始时生成一个32位或者64位的唯一编码...

2020-05-03 19:42:10 936 1

原创 dubbo微服务调用耗时统计

在文章使用注解记录方法执行时长中详细介绍了怎么记录一个方法的调用时长。这种方式适合自生应用对自己的应用做自检工作。在分布式微服务环境下,如果把一整套微服务的环境看成一个整体。想从整体去查看和分析微服务之间的调用情况,网络耗时情况,各个微服务的运行情况。就需要在服务级别去记录运行时长。看这张图。A调用B的过程可以得到4个时间戳。分别是① 调用前(请求还没发出)② 服务执行前(请求到到B,但...

2020-05-03 19:41:30 2969 1

原创 dubbo扩展类的初始化

SPI 全称为 Service Provider Interface,是一种服务发现机制。具体解释参考Dubbo官方文档的Dubbo SPI,这里面对JAVA SPI和Dubbo自己的SPI讲解非常清楚。这边谈一谈Dubbo初始化时的一些细节。dubbo有哪些扩展类?找到源码包中的/META-INF/dubbo/internal目录,会看到一堆SPI的配置。具体可以逐个翻开看看。com.al...

2020-05-03 19:40:49 363

原创 dubbo服务导出和引入

Dubbo服务的导出和引入,这部分在Dubbo官方文档的源码导读有很详细的讲解。这边分别给出连接。Dubbo源码导读-服务导出Dubbo源码导读-服务引入导出的入口每个需要导出的服务都要配置这么一条xml元素。信息包括interface和class(具体实现类)<dubbo:service interface="com.test.service.DemoService" class...

2020-05-03 19:40:03 406

原创 dubbo对注册中心的分装

Dubbo最主要干2个事情。第一个,对服务的导出和引入。第二个,维护注册中心的服务。对于第一个,尽量参考Dubbo官方文档,有详细解释。对于第二个,这边详细说说。首先找到服务注册和引用的入口RegistryProtocol,这部分不清楚的话,可以参考文档Dubbo官方文档-服务导出public void register(URL registryUrl, URL registedProvide...

2020-05-03 19:39:10 378

原创 dubbo的transporter层

介绍先来看下Dubbo的整体架构图。Transporter在倒数第二层。我用黄色线框框出来的区域。Transporter层,属于网络传输层,是Mina,Netty,Grizzly这几个服务器的抽象。为什么要单独抽象出一个Transporter层,而不是在Exchange层直接对Netty或者Mina引用?这个问题其实不难理解,Netty或者Mina对外接口和调用方式都不一样,如果在Exch...

2020-05-03 19:37:50 210

原创 dubbo的handler机制

Dubbo的整套handler。。。反正我刚看的时候挺头疼。从Protocol层到Transporter层。纵深3层。从DubboProtocol构建,被逐层传递到NettyServer,然后在逐层返回。整个过程中,还被不断包裹,从同步到异步,不停变换用法和说法。总之,看得挺累,还是坚持逐个分析一遍。下面来说说。先看一张图,是使用Dubbo Protocol并且使用Netty作为服务器的情况下H...

2020-05-03 19:37:01 1889 1

原创 dubbo的filter

在聊Dubbo Filter之前,我们先说说Web标准的javax.servlet.Filter。public interface Filter { // 初始化,Servlet容器启动时调用 void init(FilterConfig var1) throws ServletException; // 做过滤动作 void doFilter(ServletReq...

2020-05-03 19:35:43 450

原创 dubbo的exchange层

介绍先来看下Dubbo的整体架构图。Exchange在倒数第三层。我用黄色线框框出来的区域。Exchange层,属于信息交换层,是对Request和Response的抽象。为什么要单独抽象出一个Exchange层,而不是在Protocol层直接对Netty或者Mina引用?这个问题其实不难理解,Netty或者Mina对外接口和调用方式都不一样,如果在Protocol层直接对Mina做引用,...

2020-05-03 19:34:40 759

原创 dubbo的编码和序列化

为什么要序列化和反序列化RPC过程必然要序列化和反序列化。RPC是远程过程调用,A调用B,要经过网络,就会有数据传输,那就得在A端把请求参数序列化之后通过网络送到B端,B端进行反序列化。然后指向B服务,返回结果首先要在B端做序列化,之后通过网络送到A端,A端进行反序列化。这是一个完整的请求过程。分别产生2次序列化和反序列化动作。为什么要编码和反编码A调用B时,会传递信息,其中有一些公共的信...

2020-05-03 19:33:46 648 2

原创 使用注解记录方法执行耗时

介绍各个系统都在追求性能,要做压力测试。压力测试目的是要找到热点,性能瓶颈,然后解决它或者优化它,这边暂不讨论怎么解决和优化性能问题。如果不做大规模的性能测试,是否有其他方式在开发,单元测试和集成测试的时候就发现一些性能问题呢?我个人比较喜欢在编码的各个阶段都去注意性能问题,并不希望在把问题留到大规模性能测试之后再发现。那样费时费力,在解决性能瓶颈和发现下一个性能瓶颈的过程中来来回回,压力测...

2020-05-03 19:31:15 1522

eclipse plugin 导出插件包

描述了eclipse plugin导出插件包的3中方式,包括导出能够让eclipse采用install方式安装的zip包

2013-08-29

java实现的扫雷游戏源码

模拟了windows的扫雷,使用java swing技术实现的扫雷游戏

2013-01-03

空空如也

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

TA关注的人

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