一、定义 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。 详情可以参考之前的博客 单例模式。 二、实现 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,等明天过完就是放假的日子了,今天坐 9 点的班车到公司,空空荡荡的,借此机会总结下我的 2018 吧。
一、 什么是 PWA PWA(Progressive Web App)是一种理念,使用多种技术来增强 web app 的功能,可以让网站的体验变得更好,能够模拟一些原生功能,比如通知推送。在移动端利用标准化框架,让网页应用呈现和原生应用相似的体验。 就目前而言,PWA 对我产生最直接的影响有以下几点 速度的提升,缓存的使用使文章和博客的速度大大提升。 离线状态下,缓存过的文章也可以正常浏览。 PWA 应用可以表现的像原生系统一样。
0. 起因 发博客链接给朋友看的时候,反馈说访问特别慢。之前博客仅部署在 github 上,由于众所周知的原因,国外的服务器在国内访问就是有点慢,这个时候就需要一些 “奇淫巧技” 来帮忙了。
0. 起因 正常情况下 url 只会出现英文字母、数字和标点符号,特殊字符会在请求前进行 encode 操作,转化成合法的 url。 例如我们用浏览器在百度上搜索 += 时,浏览器实际上访问的是 https://www.baidu.com/s?wd=%2B%3D。 encode 操作其实是将需要转码的字符转为 16 进制,然后从右到左,取 4 位(不足 4 位直接处理),每 2 位做一位,前面加上 % ,编码成 %XY 格式。 常见特殊字符及编码后值如下:
1 定义 在日志采集和分析的过程中,有时希望能根据每一次请求把日志串联起来,让日志更能暴露出这一次请求所存在的问题。我们引入requestId作为单次请求的唯一标识,并在这条请求的所有日志中打印出该requestId。
1. Mockito
一、是什么 很多项目都会用到权限管理,目前流行的权限框架(Apache Shiro,Spring Security等)在使用的时候都觉得很繁琐,特别是在一些小型的项目中。有时候我会想,如果通过注解的方式,直接把权限注解到访问的接口方法上那该有多好。 authorize就是一个为了解决这个问题,通过注解配置权限,借助拦截器进行权限检查的一个开源权限框架。使用起来就像下面这种感觉。