第三讲

  1. try-with-resources
    jdk7之后异常处理的一个新方法,在try()中声明的资源,不用再finally中手动释放,而是系统自动会调用close()方法
  2. copy-on-write
    读写分离,读的时候不上锁,add元素的时候先拷贝一份,添加完成后再修改之前的final变量应用

第十三讲

public class VIPCenter {
	private Map<User.TYPE, ServiceProvider> providers;
	void serviceVIP(T extend User user) {
		providers.get(user.getType()).service(user);
	}
}

interface ServiceProvider{
	void service(T extend User user) ;
}

class SlumDogVIPServiceProvider {
	void service(T extend User user){
		// do somthing
	}
}
class RealVIPServiceProvider{
	void service(T extend User user) {
		// do something
	}
}

上面的示例,将不同对象分类的服务方法进行抽象,把业务逻辑的紧耦合关系拆开,实现代码的
隔离保证了方便的扩展。

第二十三讲

Java 8 以前各种类加载器的结构

启动类加载器(Bootstrap Class-Loader),加载 jre/lib 下面的 jar 文件,如 rt.jar。它是
个超级公民,即使是在开启了 Security Manager 的时候,JDK 仍赋予了它加载的程序
AllPermission。

# 指定新的 bootclasspath,替换 java.* 包的内部实现
java -Xbootclasspath:<your_boot_classpath> your_App
# a 意味着 append,将指定目录添加到 bootclasspath 后面
java -Xbootclasspath/a:<your_dir> your_Ap
p# p 意味着 prepend,将指定目录添加到 bootclasspath 前面
java -Xbootclasspath/p:<your_dir> your_A

使用最常见的 “/p”,既然是前置,就有机会替换个别基础类的实现

扩展类加载器(Extension or Ext Class-Loader),负责加载我们放到 jre/lib/ext/ 目录下
面的 jar 包,这就是所谓的 extension 机制。该目录也可以通过设置 “java.ext.dirs”来覆
盖。

java -Djava.ext.dirs=your_ext_dir HelloWord

应用类加载器(Application or App Class-Loader),就是加载我们最熟悉的 classpath 的
内容。这里有一个容易混淆的概念,系统(System)类加载器,通常来说,其默认就是 JDK
内建的应用类加载器,但是它同样是可能修改的,比如:

java -Djava.system.class.loader=com.yourcorp.YourClassLoader HelloWorld

在 JDK 9 中,由于 Jigsaw 项目引入了 Java 平台模块化系统(JPMS),Java SE 的源代码被划
分为一系列模块

前面提到的 -Xbootclasspath 参数不可用了。API 已经被划分到具体的模块,所以上文中,

利用“-Xbootclasspath/p”替换某个 Java 核心类型代码,实际上变成了对相应的模块进行
的修补,可以采用下面的解决方案:
首先,确认要修改的类文件已经编译好,并按照对应模块(假设是 java.base)结构存放, 然
后,给模块打补丁:

java --patch-module java.base=your_patch yourApp

扩展类加载器被重命名为平台类加载器(Platform Class-Loader),而且 extension 机制则
被移除。也就意味着,如果我们指定 java.ext.dirs 环境变量,或者 lib/ext 目录存在,JVM
将直接返回错误!建议解决办法就是将其放入 classpath 里。
部分不需要 AllPermission 的 Java 基础模块,被降级到平台类加载器中,相应的权限也被更
精细粒度地限制起来。
rt.jar 和 tools.jar 同样是被移除了!JDK 的核心类库以及相关资源,被存储在 jimage 文件
中,并通过新的 JRT 文件系统访问,而不是原有的 JAR 文件系统。虽然看起来很惊人,但幸
好对于大部分软件的兼容性影响,其实是有限的,更直接地影响是 IDE 等软件,通常只要升
级到新版本就可以了。