自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

简易开头 快速迭代

Result or Nothing!

  • 博客(67)
  • 资源 (3)
  • 问答 (1)
  • 收藏
  • 关注

原创 起步 —— 种一棵树最好的时间是十年前

种一棵树最好的时间是十年前。 本是空无一物的土地上,屹立着一棵参天大树。正是十年前播下了一棵幼苗,才有今天的绿荫如盖,叶茂枝繁。 如果是十年前开始认真学习书法,相信应该能写出一手漂亮的好字了; 如果是十年前开始认真钻研编程,相信已经在自己周围的IT圈子里小有名气,并且事业也蒸蒸日上了。 开始做一件事,一件关系长远的事,最好的时间是十年...

2018-12-14 00:04:41 2872

原创 怎样破解项目中的“死亡螺旋”困境

你在项目中有没有遇到过这样的困境—— 时间不足,团队新人较多,项目前期质量问题不时爆发需要加急解决,新特性排上日程又没时间开发…… 这些问题往往一环扣一环,如果处理不好,会出现这样的恶性循环—— 爆发的问题会越来越多==> 挤占特性开发升级的时间使日程越来越紧==> 加班使得效率下降质量降低==>出现更多的问题…… 老员工忙于解决问题...

2018-10-31 23:55:39 1804

原创 有趣的思想实验

有一位院士说:世界上最好的实验室就在你的两个肩膀之上! 在外在条件不足或者根本无需条件的情况下,思想实验也是不错的探索、思考方法。它可以从天马行空的想象开始,在设想的规则之下,用特殊的起始条件去推论、去归纳、去归谬,来探索规律,启示思维。 讲几个有趣的思想实验故事,供大家一乐的同时也希望能给大家一点启示。 1. 伽利略两个铁球下落速度实验 在伽利略之前,科学界信奉的是亚里士多德的理论——重量越大,下落速度越快。一个10kg的球下落速度是1kg的球的10倍。人们对此也是深信...

2021-01-25 00:58:36 1255 5

原创 windows下查找一个路径下包含某一字段的所有文件

接手了一个项目但没文档。。。 已知这个项目包含两部分,一部分用存储过程将数据写入了库;另一部分是一个java程序定时从数据库取数据发送邮件。问题是不知道是哪个java程序jar包,也不知道是哪个脚本,也不知道放哪。 好在知道是在哪个机器上,还知道是用脚本启动它的。 但调用java程序,它就包含 "java -jar ",那么就查找一下哪些个脚本调用了java的jar包。 来到查找的根目录下,打开命令行findstr /s "java -jar" *....

2020-07-09 23:22:47 725

原创 PL/SQL 10G报错 Initialization error Oracle Client not properly installed OracleHomeKey: OralceHomeDir:

win7 64位电脑上安装PL/SQL 10G 64位报错 (其实PL/SQL 10G早已经过时,直接安装11G即可。可公司内网不允许下载别处软件,只能处理错误)1. 下载一个 instantclient软件 (我下的是12.2版本的),将它解压到自己指定的文件夹(如这里用 C:\Program Files(X86)\instantclient)2.添加环境变量 变量名: TNS_ADMIN 变量值: C:\Program F...

2020-06-01 19:22:43 4262

原创 IDEA创建SpringMVC工程的jsp文件中EL表达式取不到值,直接${}原样打印出来

一、问题描述 IDEA创建SpringMVC工程,在jsp文件中EL表达式取不到值,直接将EL表达式打印了出来。 二、 原因 Intellij Idea 在创建Maven工程时选择的webapp框架时自动导入的web.xml文件的头可能是<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, In...

2020-04-16 01:16:43 658 2

转载 MyBatis源码(3)—— Mybatis 缓存系统源码解析

掂量了一下,自己写的话写不了这么好,转载过来,学习膜拜! 写是为了会,不是为了写。 https://zhuanlan.zhihu.com/p/86332753...

2020-03-15 23:12:27 144

原创 泛型&lt;T&gt;和 &lt;?&gt; 的区别

技术交流群里有小白问这个问题,并转发了一些blog给我看。 感觉写的不够通透,而且有错误的地方,特地写一下。1. Class<T> 表示一个定义了一个泛型 这个类型不确定, 但是不能同时变成两个类型 举个栗子 我们将两个不同类型的链表合并 public static <T> void merge1(Lis...

2020-02-16 01:04:49 346

原创 MyBatis源码(1)—— MyBatis架构梗概

目录一、 我是如何看源码的二、MyBastis架构1. 预先分析一下MyBatis的骨架2. 根据这个架构写出一个MyBatis的1.0版本Demo3. 看1.0版本有哪些不足,该添加些什么,该怎样升级4. 开始看真实的MyBatis源码, 理出其骨架5. 查看MyBatis源码中的各模块代码,查看相互联系和代码实现一、 我是如何看源码的 看框...

2020-02-11 00:40:18 334

转载 一名IT经理是如何把项目带崩的。。。

我是一名项目经理,在过去的四个月里,我把一个项目带崩了(上线后频出问题,用户无法使用)。在最近的几天,我每天都在反思自己,我都在问自己以下几个问题:1.我做错了什么?2.我在其中占有多重的因素?以下内容,我将回答以上问题,并在最后说一下我的补救措施。一、项目和团队背景首先给大家说明一下项目背景,以便各位对此项目有更清晰的了解:1.该项目是一个二次开发项目,第一...

2020-02-09 18:12:22 297 1

原创 (1)Mysql索引原理

一、 什么是索引 数据库索引是为了加快数据检索而创建的一种分散存储的数据结构。 它的本质是一种数据结构,它的作用就像一本书的目录。有了目录,我们可以尽快找到书中想要的内容的位置;有了索引,我们不必再去扫描整张表,可以加快检索过程。 创建和存储索引这种数据结构也需要消耗空间,这是一种用空间换时间的做法。 二、索引的数据结构演进 三、索引...

2019-12-31 23:59:26 136

原创 java.lang.NoClassDefFoundError: org/springframework/orm/hibernate3/support/HibernateDaoSupport

一、 问题 Hibernate查询数据库编译通过,但运行时报错 严重: ContainerBase.addChild: start:org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].Standa...

2019-12-19 17:12:43 2089

原创 程序猿那点事儿之—— 唐僧的法宝

话说唐僧从唐太宗那里领了项目,在观音的指点下先后收服了三个徒弟组建了项目组,一路上斩妖除魔,项目进展顺利。 一天,中途休息的时候,组里的运维小弟沙悟净找到唐僧,作了个揖,说...

2019-11-03 00:19:24 229

原创 手写简易RPC框架

分布式技术的本质可以简单地概括为两部分—— 任务拆分 + RPC 1. 将一个任务流程拆分成几个部分,需要扛压的部分做成集群 2. RPC调用 (特别是通信) 再概括点说分布式的本质就是RPC,也不算过分。 我们手写一个RPC。一、 RPC框架 以本次Demo代码为例,讲解下RPC框架和流程。 Server端通过pu...

2019-10-30 01:22:21 316

原创 关于区块链技术高并发可行性的一个疑问

这几天区块链技术火的有点不正常,这种不正常的热度说白了就是有人在炒作趁热割韭菜。 区块链技术据说将来可以代替绝大多数的证券、银行等部门的服务器,在交易、数据安全、知识产权保护等方面发挥巨大的作用,是面向未来的技术。 对于这样前途无量的技术,自己有一个问题没有想明白,想求助大神们解答。 区块链是一种去中心化的分布式的记账数据库,以集群中的所有个体节点共同...

2019-10-28 15:19:06 2357

原创 IDEA 报 cannot access class xxx

IDEA顺手写一个小Demo。先写一个interface MyInterface, 然后写实现类 MyInterfaceImpl,结果在MyInterfaceImpl 中始终报错误 cannot access classMyInterfaceImpl。 然后在网上查找解决方案,说是IDEA的bug,重启一下或者JDK版本没有设置成统一的,结果都没有解决。 删除掉j...

2019-10-26 23:51:04 2998 1

原创 架构是进化出来的

一个网站的架构是进化出来的,不是设计出来的。 架构是为了业务服务,在业务没有达到足够大的量级之前,没有必要为了架构而架构。只有随着业务的规模变大,才逐渐有了架构的进化。 以一个在线电商平台为例,讲一下架构的进化过程。1. 单体服务器 商品/订单/用户/交易 都在一台服务器上2. 数据库单独部署 应用继续增加,应用服务器承压...

2019-10-24 22:50:32 3569

原创 lua.c:82:31: fatal error: readline/readline.h: No such file or directory

目录坑(一)添加libreadline-dev 包坑(2)显示缺少 libreadline6-dev, 于是又用命令坑(3)解决办法: 在ubuntu16.0.4上安装lua 5.3.5,运行命令make linux 报错 lua.c:82:31: fatal error: readline/readline.h: No such file or ...

2019-10-17 20:49:30 3847

原创 画图趣解CLH锁的实现原理

面试题上看到CLH锁的实现原理,想找视频看看没找到,各种博客写的也很抽象,缺乏形象感不易理解。于是就自己写一个,争取做到通俗易懂。 CLH锁是自旋锁的一种实现方式 (java自旋锁的4种实现方式),实现了自旋锁的公平性,即按照请求锁的时间先后顺序来获取锁。之所以叫CLH锁, 是因为它的作者是Craig,Landin andHagersten,取他们的名字首字母而命名的。CL...

2019-10-15 19:41:05 613 2

原创 (9)读写锁ReentrantReadWriteLock解析

一、 ReentrantReadWriteLock简介 ReentrantReadWriteLock是在AQS的基础上实现的一个可重入锁。它的内部维护了一把读锁和一把写锁,读锁是共享锁,写锁是排他锁。这样就保证了写数据时的线程安全性,又保证了读数据时的多线程并发,比较适合读取数据较多而写数据较少的并发场景。 写一个例子演示ReentrantReadWriteLock的使用。...

2019-10-05 02:38:54 2462

原创 程序猿八荣八耻——又一波!

以编程规范为荣,以风格邋遢为耻。以注释清晰为荣,以不写注释为耻。以日内完工为荣,以加班加点为耻。以代码自测为荣,以只写不测为耻。以不断提升为荣,以不思进取为耻。以解决问题为荣,以撕逼甩锅为耻。以互助提高为荣,以装逼炫技为耻。以团结同事为荣,以恃才傲物为耻。...

2019-10-03 19:15:04 319

转载 程序猿八荣八耻

以动手实践为荣,以只看不练为耻。以打印日志为荣,以出错不报为耻。以局部变量为荣,以全局变量为耻。以自动化测试为荣,以手工测试为耻。以代码重用为荣,以复制粘贴为耻。以多态应用为荣,以分支判断为耻。以定义常量为荣,以魔法数字为耻。以总结思考为荣,以不求甚解为耻。...

2019-10-03 17:30:47 292

原创 (8)线程自留地——ThreadLocal

在并发编程中,为了线性安全我们经常要使用各种各样的“锁”。 不管锁的粒度如何小,哪怕是CAS操作,都存在先来后到的排队问题。有时候我们只是单纯地计数,没有太复杂的操作,想要一种不涉及锁的线程安全的操作——ThreadLocal就是一种无锁的线程安全的设计。 当使用ThreadLocal修饰变量时,ThreadLocal为每个线程(thread)设置了一个独立的局部(local)变...

2019-10-03 16:52:48 286

原创 (7)AbstractQueuedSynchronizer和ReentrantLock—— 可重入锁的实现

目录一、 可重入锁与非可重入锁二、 公平锁与非公平锁三、独占锁与共享锁四、AbstractQueuedSynchronizer(AQS)五、ReentrantLock1. lock方法2. tryAcquire方法3. 可重入的实现六、用AQS实现一个自己写的重入锁一、 可重入锁与非可重入锁 可重入锁,就是当一个占有锁的线程再次进入到这个锁的...

2019-09-27 18:06:16 294 3

原创 啥时候用interface,啥时候用abstract类? 就一句话

有初学者问interface和abstract类该怎样选择的问题,不扯面试题那些,其实就一句话:定义为abstract类,就是为了定义较多的已实现方法好让人继承;继承者就不用写这么多的实现了,可以直接拿来用;定义为interface,只是为了规定含有哪些方法,统一一个调用的模板。...

2019-09-27 02:29:16 667

原创 项目如行军——《孙子兵法》之九地篇

之前读《华杉讲透孙子兵法》一书,感觉行军打仗与做项目是相通的。这也很容易理解,因为孙子兵法的精髓就是知己知彼百战不殆,讲的就是如何用精确的认知与正确的做法来做好打仗这件事。做项目也是用正确的方法调度资源(人、物、时间等)来做成一件事。实际上做任何事都是这样,不仅限于项目。 兵法这样精深的东西,即使一辈子投入进去也不敢说精通,更不要说自己这样仅仅读过几遍的外行。这里不去探讨兵法虚实...

2019-09-22 01:18:46 865 2

原创 (6)Atomic类原子操作,不用加锁的绝快妙招

对于简单的计数和加减操作,lock和synchronized的锁粒度太大,容易导致高并发时效率问题。J.U.C包中提供了一个更加高效的解决方案——Atomic类。它的底层通过CAS操作来实现并发安全性。 Atomic类里提供了4种操作对象,下面分别介绍。一、 基本原子类型 AtomicBoolean AtomicInteger AtomicLong 以...

2019-09-21 20:03:53 576

原创 (5)HashMap原理解析——为啥线程不安全?

目录一、 HashMap的数据结构二、HashMap的功能实现源码解析1. hash方法2. 由链表改为红黑树3.扩容4. 扩容后的新位置5. 搬家三、 怎样将HashMap升级为线程安全的1. HashMap为啥线程不安全呢?2. HashMap应该怎样实现线程安全呢?一、 HashMap的数据结构1.7版本与1.8版本数据结构的区别 ...

2019-09-14 00:32:52 523 1

原创 (4)Java可见性、原子性、有序性的本质——CPU缓存模型

我们来看一下并发编程中的原子性、可见性、有序性是怎么来的。 早期CPU的频率比内存的频率要高很多,如果CPU每次都从内存取数据的话,就会造成快车等慢车的状态,严重影响CPU的性能。为了解决这个问题,CPU中引入了缓存。缓存的频率很高,几乎跟CPU一个级别。于是就将一些用到的重要数据复制一份放到缓存中,CPU直接跟缓存交互,就能消除内存与CPU频率相差较大的问题了。 在单...

2019-09-11 17:36:02 569 5

原创 Dubbo的一种负载均衡算法(rtt排序)

一、 题目要求: 题目来自阿里云中间件性能挑战赛,找一种性能最佳的Dubbo负载均衡算法。 provider的性能要求二、分析 其实一个比较能代表当前provider性能的指标就是rtt(round-trip-time,一次调用返回时间), 这一指标比剩余线程数、CPU/内存占用率、权重比值都更直接体现provider的当前性能。因此,应当尽量地去应用这一指...

2019-09-07 00:12:49 403

原创 图解设计模式(13) 中介者模式

一、应用场景 每一个类都有不同的职能,如果这些职能要相互调用所有其他功能的类,会使得它们的关系变得复杂化()。这时就可以在它们中间加入一个"Boss",负责协调调度各种关系,使关系变得简单。 例如,在一个公司里有研发、财务、市场等部门,如果直接由各个部门去与其他所有部门联系,则会将关系复杂化。可以通过加入一个中介(比如老板)去统筹调用各个部门来简化这种关系。(这个例子...

2019-09-06 00:39:30 312

原创 图解设计模式(12) 模板模式

一、应用场景 用于一些具体流程固定,但是其中的某一个/一些步骤内容有变动的情形。 如:去银行办理业务分3个步骤: 模板方法定义了一个操作中的流程骨架,将某些步骤延迟到子类中实现。这样,子类可以在不改变算法结构的前提下重新定义该算法的某些特定步骤。二、具体实现 实现要点1. 定义一个abstract template类,在其中定义一个子...

2019-09-04 19:51:47 242

原创 图解设计模式(11) 策略模式

一、 应用场景 商场对于不同的客户采用不同的打折策略; 施工对于不同的地形地貌采用不同的施工方法;数据处理针对不同批量的数据选取不同的算法等。 对于常用的 if() { }else if(){ }else if(){ }else{} 结构,可以采用策略模式来重构。 当增加新的模式时,不需要修改原有的代码,符合开闭原...

2019-09-04 18:49:27 330

原创 图解设计模式(10) 责任链模式

一、应用场景 当责任或者功能呈层级划分时使用。 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。 例如,单位请假审批, 小组长能批一天,超过一天要经理批;经理能批3天,超过3天要找CEO批;超过7天CEO拒绝。 JDK中的Exce...

2019-08-31 23:59:33 302

原创 图解设计模式(9) 委派模式

一、 应用场景委派模式,委派模式是一个类A持有另一个类B的对象,当A要做事情时,调用B的对象去做。就像一个老板,公司来活了不是他自己去干,而是委派别人去做。委派模式不是23种设计模式中的一种。二、 具体实现实现要点:1. 一个interface,统一规定要实现的方法。2.被委派者,实现接口,也就是事实上做事的人。3.委派者,实现接口,并且内部保存有被委派...

2019-08-31 23:56:52 232 1

原创 图解设计模式(8) 观察者模式

一、应用场景定义对象间一种一对多的依赖关系,使得当一个对象的状态改变,则所有依赖于它的对象都会得到通知并被自动更新。就是一种一对多的广播机制。 订阅者或者消息接收者称为观察者。二、 实现要点1. 观察者接口,声明update方法用于更新数据。2. 观察者实现类,implements 观察者接口的update方法。3. 主题类,在其中包含容纳所有观察者的list, 通...

2019-08-31 23:54:41 469 3

原创 图解设计模式(7) 代理模式

目录一、使用场景二、静态代理三、 动态代理一、使用场景 通过代理,控制对类/对象的访问。 我们用一个代理对象把真实对象包装起来,真实对象的所有动作都通过代理对象去做,代理对象可以决定是否以及何时由真实类去做,何时由代理类去做。 比如,一个明星(如刘德华),在接到一个演出合同的时候,需要做一系列的事情。 面谈,签合同,收预付款,订机票,演出,收尾款...

2019-08-31 23:53:56 323 1

原创 图解设计模式(6) 装饰模式

一、 适用场景 动态地为一个对象增加新的功能。 装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免了产生过多类型。 比如一个汽车,具有行驶的功能。后来业务扩展需要又需要它有飞行、潜水、自动驾驶的功能,如果这些功能都通过继承去实现的话,它们两两组合要写好多的类。 这个时候我们就...

2019-08-31 23:51:52 225 1

原创 图解设计模式(5) 适配器模式

一、适用场景 如生活中键盘有USB接口的和ps/2接口的。我们手上有一个ps/2接口的键盘但笔记本电脑只有USB接口,我们只要找一个接口转换器就能让键盘在笔记本电脑上使用了。 适配器模式是将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能相互调用的类能够一起工作。二、实现 适配器的实现需要3个构件: 目...

2019-08-31 20:28:29 242

原创 图解设计模式(4) 原型模式

目录一、应用场景二、原型模式的实现1. Cloneable接口和clone方法2.浅克隆与深克隆一、应用场景 原型模式就是利用一个对象去创建另一个对象,就是C++中的拷贝构造。 如果通过new创建一个对象需要非常繁琐的数据准备或访问权限设置,则可以使用原型模式。以某个对象为原型,复制出新的对象,新的对象具有原型对象的特点。 优点: 效率高(直接克隆...

2019-08-31 18:28:50 298

空空如也

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

TA关注的人

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