java类加载流程,类加载机制及自定义类加载器
引言 当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、链接、初始化三个步骤对该类进行类加载。 类的加载、链接、初始化 加载 类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象。类的加载过程是由类加载器来完成,类加载器由JVM提供。我们开发人员也可以通过继承ClassLoader来实现自己的类加载器。 加载的class来源 从本地文件系统内加载class文件 从JAR包加载class文件 通过网络加载class文件 把一个java源文件动态编译,并执行加载。 链接 通过类的加载,内存中已经创建了一个Class对象。链接负责将二进制数据合并到 JRE中。链接需要
为什么java中的String是Final或不可变的
该问题在面试过程中经常被提及,考察对String的设计和原理的理解。主要是因为线程安全、性能和安全原因,通过将String修饰为final,不允许被继承,也就避免了对内部实现进行修改的机会。下面对各方面进行描述: 线程安全 因为字符串是不可变的,所以是线程安全的,同一个字符串可以被多个线程共享,不用考虑线程安全而进行同步加锁操作 性能 因为字符串使用的非常频繁,如果每次创建一个字符串都在堆上创建一个对象,将对性能和内存造成一定的影响。所以,字符串是分配在字符串常量池(String pool)中,而且是全局共享的,这里常量的意思很明显,分配之后就不可修改了。如果能被随意修改,当定义一个字符串"s
java wait notify
wait、notify、notifyAll都是Object的方法,主要用于多线程环境中对线程进行协调。在使用时必须包含在同步代码块中(如:synchronized)且所属的锁资源必须相同,否则将抛出IllegalStateException。 下面对这3个方法进行介绍: wait 使当前线程等待,同时释放当前获得的锁资源,使其它线程可以获取锁资源并进行相关操作,直到其它线程调用了notify或notifyAll之后再唤醒该线程,唤醒之后将重新获取锁资源并继续执行。 notify 将一个当前处于等待状态中且有相同锁资源的线程唤醒。如果有多个线程处于等待状态,将随机唤醒其中的一个。需要注意的是,被唤醒的线程并不会立即执行,