1. 状态模式的实现

    一、写在前面 之前有介绍过状态模式,但是不是特别直接。后来写了一篇 Spring StateMachine 介绍,有几位同学联系我说想要源码。但是其实我觉得如果不是逻辑特别复杂的话,我不是特别推荐使用状态机。因为我们完全可以通过状态模式来实现,而且更加灵活和简单。

    2019/08/16 design patterns

  2. 青蛙与动态规划

    1. 问题 之前遇到过这么一个问题 ,说有一只青蛙,它想跳到 n 层的楼梯上面去,由于自身原因,它每次只能选择跳 1 层或者 2 层。 问,青蛙有多少种跳法?

    2019/06/11 algorithm

  3. 关于生活的一点思考

    1.关于婚姻 2019-03-17 我们在家里举行了婚礼,婚礼还算是隆重。同学、朋友、亲戚和乡里乡亲来的不少,也搞得热热闹闹的,挺开心。当天下午婚礼完成后,粘床就睡着了,有点累也有点满足,我想我们完成了对彼此的承诺。换回正常的衣服,第二天去了我姥姥家,下午又回了门。其实我之前并不喜欢这些仪式,觉得是一种华而不实的繁文缛节而已。但是亲身经历过后改变了我的一些想法,生活是需要仪式感的,真的需要。

    2019/05/10 life

  4. 常见缓存淘汰算法

    一、缓存 缓存(Cache) 一词来源于 1967 年的一篇电子工程期刊论文。其作者将法语词 “cache” 赋予 “safekeeping storage” 的涵义,用于计算机工程领域。 最早是因为 CPU 与内存之间运算和读写速度不一致,在 CPU 添加一块空间用于提前将内存中数据加载进来,提高 整体的速度,这块空间被称为 缓存(Cache)。如今缓存的概念已被扩充,在内存和硬盘之间也有 Cache(磁盘缓存),乃至在硬盘与网络之间也有某种意义上的 Cache ──称为 Internet 临时文件夹或网络内容缓存等。凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为 Cache。 但是缓存的空间是宝贵的,所以我们不会将所有的数据都缓存起来,必须依赖一定的规则淘汰掉一部分数据。这个规则就是我们讨论的缓存淘汰算法。

    2019/01/26 algorithm

  5. 单例模式的实现

    一、定义 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。 详情可以参考之前的博客 单例模式。 二、实现 2.1 基本实现 单例模式可以笼统的分为 饿汉式 和 懒汉式。 // 饿汉式 public class Singleton { /** 私有的构造方法 */ private Singleton() { } /** 私有的静态的对象 */ private static Singleton singleton = new Singleton(); /** 公共的静态的获取对象的方法 */ public static Singleton getInstance(){ return singleton; } } // 懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */ private static Singleton instance = null; /* 私有构造方法,防止被实例化 */ private Singleton() { } /* 静态工程方法,创建实例 */ public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */ public Object readResolve() { return instance; } } 饿汉式 会在类加载时直接创建对象。懒汉式 有点类似懒加载的感觉,在第一次使用的时候创建对象,但是这样也带来一个问题,如何保证线程安全。 上面的 懒汉式 其实是有问题的,多线程同时调用的时候会创建多个实例,所以用的比较多的是 double check 的实现方式。 // double check public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */ private static Singleton instance = null; /* 私有构造方法,防止被实例化 */ private Singleton() { } /* 静态工程方法,创建实例 */ public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */ public Object readResolve() { return instance; } } 这样就能保证线程安全,保障只有一个实例最后会被创建。但还有一个问题,JVM 可能会在执行的时候进行指令重排序, 因为 instance = new Singleton(); 这条语句并不是一个原子性操作,实际上是执行了三件事情。 给 Singleton 分配空间 调用构造方法,实例化 将 instance 指向 1 中分配的空间

    2019/01/26 design patterns

  6. 2018 年终总结

    今天是 2019-01-26,等明天过完就是放假的日子了,今天坐 9 点的班车到公司,空空荡荡的,借此机会总结下我的 2018 吧。

    2019/01/26 experience life

  7. jekyll 博客的 PWA 配置

    一、 什么是 PWA PWA(Progressive Web App)是一种理念,使用多种技术来增强 web app 的功能,可以让网站的体验变得更好,能够模拟一些原生功能,比如通知推送。在移动端利用标准化框架,让网页应用呈现和原生应用相似的体验。 就目前而言,PWA 对我产生最直接的影响有以下几点 速度的提升,缓存的使用使文章和博客的速度大大提升。 离线状态下,缓存过的文章也可以正常浏览。 PWA 应用可以表现的像原生系统一样。

    2019/01/23 experience

  8. 博客部署 github 和 coding 双节点

    0. 起因 发博客链接给朋友看的时候,反馈说访问特别慢。之前博客仅部署在 github 上,由于众所周知的原因,国外的服务器在国内访问就是有点慢,这个时候就需要一些 “奇淫巧技” 来帮忙了。

    2019/01/14 experience