Wudashan Blog

Java开发工程师

《人月神话》读书笔记

人月是危险和带有欺骗性的神话,因为它暗示人员数量和时间是可以相互替换的

书籍链接:https://book.douban.com/subject/26358448/ 序言 书名《人月神话・40周年中文纪念版》,2015年清华大学出版社出版,但这本书其实是1995年《人月神话・20周年英文纪念版》的一个译本,这种把20年前的书翻译后称作40周年也太标题党了。那么,由上面的描述就可以推算出第一版《人月神话》,是在1975年出版的,掌握这几个时间点,有利于...

Java如何对一个对象进行深拷贝?

深拷贝实现代码:https://github.com/wudashan/java-deep-copy 介绍 在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。而深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改变。如下图描述: 了解了...

Template Method 模板方法模式

定义一个抽象方法,交由子类去实现。

定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模式名和分类 模板方法模式,属于行为模式。 动机 以前小学老师上课曾问过这样一个问题:把大象放进冰箱需要几个步骤?答案是三个步骤:1)打开冰箱 2)把大象放进冰箱 3)关上冰箱。若我们把大象放进冰箱看成是一个任务,那么完成这个任务需要有三个步骤...

如何快速过滤出一次请求的所有日志?

使用SLF4J日志框架的MDC工具,将请求ID植入一次请求的生命周期。

示例源码地址:https://github.com/wudashan/slf4j-mdc-muti-thread 前言 在现网出现故障时,我们经常需要获取一次请求流程里的所有日志进行定位。如果请求只在一个线程里处理,则我们可以通过线程ID来过滤日志,但如果请求包含异步线程的处理,那么光靠线程ID就显得捉襟见肘了。 华为IoT平台,提供了接收设备上报数据的能力, 当数据到达平台后...

Redis分布式锁的正确实现方式(Java版)

不瞒你们说,网上80%的实现都是有缺陷的

本博客使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景。 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟...

公司编程竞赛之最长路径问题

从深度优先搜索算法到贪心算法,再到模拟退火算法

算法源码地址:https://github.com/wudashan/longest-path-problem 前言 最近产品线举办了一个软件编程大赛,题目非常的有趣,就是在一个9 × 9的格子里,你要和另一个敌人PK,在PK的过程中,你可以吃格子里的果实来提升攻击力。每次可以往正上、正下、正左、正右、左上、左下、右上、右下八个方向走。每次要么连续吃果实要么连续走空白区域,且不能...

Spring Batch批处理框架介绍

一款轻量的、全面的批处理框架,用于开发强大的批处理应用程序。

本篇博客基于Spring Batch的3.0.8版本。 前言 在大型的企业应用中,或多或少都会存在大量的任务需要处理,如邮件批量通知所有将要过期的会员等等。而在批量处理任务的过程中,又需要注意很多细节,如任务异常、性能瓶颈等等。那么,使用一款优秀的框架总比我们自己重复地造轮子要好得多一些。 我所在的物联网云平台部门就有这么一个需求,需要实现批量下发命令给百万设备。为了防止枯燥乏...

Californium开源框架之源码分析(八)

element包,网络通信基本定义。

项目源码地址:https://github.com/eclipse/californium element包 element根目录下,定义了网络层通信的基本类。 根目录 CorrelationContext接口 一个提供上下文信息的接口,用于在发送和接收报文时存储特定的信息。该接口声明了get(String key)方法,返回String值。 MapBasedCorr...

Californium开源框架之源码分析(七)

core包,一些封装好的供开发者使用的类。

项目源码地址:https://github.com/eclipse/californium core包 core根目录下,封装好了一些供开发者使用的类。 根目录 CaliforniumFormatter类 该类继承了java.util.logging.Formatter类,并重写了format()方法。对日志输出进行了格式化处理,默认给每条日志添加线程id、日志级别、类...

Californium开源框架之源码分析(六)

network模块(下),网络传输核心模块。

项目源码地址:https://github.com/eclipse/californium network包 network包目录下,是框架中网络传输的核心模块。 stack包 该模块为CoAP协议栈,模块一共有以下类: Layer接口 该接口表示抽象的协议层,负责处理CoAP消息。当处理完后,会将消息往上层或下层传递,由它们继续处理。使用的是设计模式中的职责链模...