技术编程|Java知识点梳理( 三 )


文章图片

文章图片

改进后责任链(CoR)模式的应用是比较广泛的 , 包括 Java Web Filter(链式调用) , Struts2 Interceptor(Action代理)和SpringMVC等 。7、单例模式
单例模式核心在于为整个系统提供一个唯一的实例 , 为整个系统提供一个全局访问点 。单例模式从实现上可以分为饿汉式单例和懒汉式单例两种 , 前者天生就是线程安全的 , 后者则需要考虑线程安全性 , 常见的线程安全的懒汉式单例的实现有内部类式和双重检查式两种 。下面给出单例模式几种常见的形式:
(1)饿汉式单例
技术编程|Java知识点梳理
文章图片

文章图片

(1)懒汉式单例
技术编程|Java知识点梳理
文章图片

文章图片

(1)线程安全的懒汉式单例 —— 内部类方式
技术编程|Java知识点梳理
文章图片

文章图片

内部类方式线程安全懒汉式单例的内在原理在于:虚拟机会保证一个类的类构造器
()在多线程环境中被正确的加锁、同步 , 如果多个线程同时去初始化一个类 , 那么只会有一个线程去执行这个类的类构造器
() , 其他线程都需要阻塞等待 , 直到活动线程执行
()方法完毕 。特别需要注意的是 , 在这种情形下 , 其他线程虽然会被阻塞 , 但如果执行
()方法的那条线程退出后 , 其他线程在唤醒之后不会再次进入/执行
()方法 , 因为在同一个类加载器下 , 一个类型只会被初始化一次 。
(4)线程安全的懒汉式单例——双重检查方式
技术编程|Java知识点梳理
文章图片

文章图片

8、类的生命周期及其初始化时机
类的生命周期主要包括加载、链接、初始化、使用和卸载五个阶段 , 如下图所示:
技术编程|Java知识点梳理
文章图片

文章图片

(1)遇到new、getstatic、putstatic或invokestatic这四条字节码指令时:注意 , newarray指令触发的只是数组类型本身的初始化 , 而不会导致其相关类型的初始化 , 比如 , new String[]只会直接触发String[]类的初始化 , 也就是触发对类[Ljava.lang.String的初始化 , 而直接不会触发String类的初始化时 , 如果类没有进行过初始化 , 则需要先对其进行初始化 。生成这四条指令的最常见的Java代码场景是:
①使用new关键字实例化对象的时候;②读取或设置一个类的静态字段(被final修饰 , 已在编译器把结果放入常量池的静态字段除外)的时候;③调用一个类的静态方法的时候 。
(2)对类进行反射调用时:使用java.lang.reflect包的方法对类进行反射调用的时候 , 如果类没有进行过初始化 , 则需要先触发其初始化 。
(3)初始化子类时:当初始
技术编程|Java知识点梳理
文章图片

文章图片

化一个类
技术编程|Java知识点梳理
文章图片

文章图片

时候 , 如果发现其父类还没有进行过初始化 , 则需要先触发其父类的初始化 。


推荐阅读