码上游记

hongjian.xia的个人博客

0%

引言

在日常开发中经常遇到这样一个场景:在拦截器中对用户做统一的鉴权,鉴权通过后将当前登录用户的信息ThreadLocal使用存储在当前线程中,方便后续业务代码中使用。但有时,执行的业务比较耗时,
我们会将业务执行逻辑封装到由@Async标注的异步方法中或提交到线程池中执行,这时在执行业务代码会无法获取到之前缓存的用户信息,因为线程已经发生了切换。
那么,我们改怎样将任务提交任务线程缓存的数据传递给执行线程呢?

阅读全文 »

什么是观察者模式

观察者模式在对象之间定义一对多的依赖,当一个对象改变状态,依赖它的对象都会受到通知。

观察者模式有两个角色:“主题”和“观察者”。观察者只需要在主题处注册,当主题状态发生变化的时候,就会主动通知观察者。这种实现方式,既使得观察者能及时获取到主题的变化,也简化了观察者的实现逻辑(不需要去不停地轮询,判断主题状态是否发生变化),同时减轻了主题的压力,因为观察者的轮询会造成性能损耗。

阅读全文 »

背景介绍

现在有一款鸭子模拟游戏:SimUDuck。游戏中会出现各种鸭子,一边游泳一边呱呱叫。

设计

很自然的可以想到,先设计一个Duck父类,并且包含两个实现好了的方法swimquck。并且对于不同鸭子,有着不同的外观,
所以需要一个display方法来描述鸭子的外观。
于是乎,得到了下面这么一个抽象类Duck以及一些它的子类:

阅读全文 »

二叉堆概述

二叉堆(下文简称为堆)是一种优先队列,对于一个优先队列应该至少包含insert(插入)和deleteMin(删除最小者)两个操作。
堆具有 结构性堆序性 两个性质。

阅读全文 »

概述

归并排序是一种时间复杂度为$ O (N\log N) $的排序算法,使用的是 分治 的策略。
算法的基本操作是合并两个已经排序的序列,因为两个序列是已经排序了的,所以将它们按顺序复制到第三个序列中,可以通过一次遍历完成。
所以将原序列使用递归不断的分成两个子序列,直至序列中是元素个数为1,此时序列为已经排序完成的,将两个子序列合并,得到一个排序完成的序列,再继续合并,直至整个序列都是已排序的。

阅读全文 »

插件推荐

推荐大家安装IDE Features Trainer这款插件,插件通过示例帮助我们记忆各种常用的快捷键,以下收录的快捷键都是插件中提及的。

阅读全文 »

起源

最近在工作中需要一些Perl脚本,发现目前项目中脚本的公共功能的复用做得很差,并且现存的复用脚本也只是使用require "/your/path/your_script.pl";简单的引用,并没编写成模块(.pm),安装到@INC目录中。于是就有了这篇博文。在介绍模块编写方法之前,我们先来说说两种加载模块的方式。

阅读全文 »

概述

由于新版本的Chrome对于非HTTPS网站都会提示不安全,十分影响使用体验,所以打算把博客站点升级到HTTPS。

运行环境

此博客系统的运行环境是阿里云Ubuntu14.04(不记得当初买ECS的时候为什么会选这个版本,可能是忘记选了吧😂),Nginx, Spring Boot。

阅读全文 »

此博文是从之前自己搭建的博客系统中迁移过来的。

起源

在2017年12月底,当时兴起了一个搭建自己的博客想法,然后买了服务器,开始着手搭建。但是后面由于种种原因搁置了(其实就是自己的拖延症😂)。之后断断续续写了一点代码,直到今年年后,才真正开始。

项目相关

首先此博客系统是根据Tale修改而来,主要是将后台实现替换成了Spring Boot+MyBatis+FreeMarker,在此也要感谢Tale的作者@biezhi写出了这么棒的项目。

阅读全文 »