1. 青蛙与动态规划

    1. 问题

    2019/06/11 algorithm

  2. 关于生活的一点思考

    1.关于婚姻

    2019/05/10 life

  3. 常见缓存淘汰算法

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

    2019/01/26 algorithm

  4. 单例模式的实现

    一、定义 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。 详情可以参考之前的博客 单例模式。 二、实现 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

  5. 2018 年终总结

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

    2019/01/26 experience life

  6. jekyll 博客的 PWA 配置

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

    2019/01/23 experience

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

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

    2019/01/14 experience

  8. RestTemplate中的URLEncode

    0. 起因 正常情况下 url 只会出现英文字母、数字和标点符号,特殊字符会在请求前进行 encode 操作,转化成合法的 url。 例如我们用浏览器在百度上搜索 += 时,浏览器实际上访问的是 https://www.baidu.com/s?wd=%2B%3D。 encode 操作其实是将需要转码的字符转为 16 进制,然后从右到左,取 4 位(不足 4 位直接处理),每 2 位做一位,前面加上 % ,编码成 %XY 格式。 常见特殊字符及编码后值如下:

    2018/12/22 踩坑