JVM的工作原理:
A:类加载器:通过类加载器将编译好的字节码文件加载到JVM中。
B:字节码校验器:校验加载过来的字节码的合法,如是否损坏或者被病毒篡改过等。如果校验失败则不会继续执行了。
C:解释器:解释执行字节码生成目标平台的机器码运行。
静态成员在什么时候就存在了?在字节码文件被成功加载到JVM中后就存在了。
实例成员什么时候存在的?在实例化对象后才存在。
静态方法为什么不能访问实例化成员?因为静态方法存在时实例成员可能根本不存在,让一个存在的东西去访问一个根本不存在的东西,逻辑上不通。
设计模式:解决固定问题的固定办法。
单:一个
例:实例(对象)
单例:一个对象
单例设计模式:对外只提供一个对象的设计模式。
单例设计模式的分类:根据对象的实例化时机
饿汉式:
设计步骤:
- A:声明一个私有的静态的最终的本类类型的对象并实例化
- B:构造函数私有化
- C:通过公有的静态方法返回第一个声明并实例化好的对象。
public class Person {
//1.声明一个私有的静态的最终的本类类型的对象并实例化
private static final Person instance=new Person();
//2.构造函数私有化
private Person(){
System.out.println("===Person()==");
}
//3.通过公有的静态方法返回第一个声明并实例化好的对象。
public static Person getInstance(){
return instance;
}
}
懒汉式:
设计步骤:
- A:声明一个私有的静态的本类类型的对象
- B:构造函数私有化
- C:通过公有的静态方法返回第一步声明的对象。
- 但是注意:需要判断对象是否实例化过,如果没有实例化则马上实例化,如果已经实例化则直接返回。
public class Pig {
//1.声明一个私有的静态的本类类型的对象
private static Pig instance=null ;
//2.构造函数私有化
private Pig(){
System.out.println("===Pig()==");
}
/**
* 3.通过公有的静态方法返回第一步声明的对象,
* 但是注意:需要判断对象是否实例化过,如果没有实例化则马上实例化,如果已经实例化则直接返回。
*
* 线程同步的实现方式有两种:
* A:同步函数
* B:同步代码块
*
* 区别:
* A:同步函数使用的锁是:
* A:实例方法:this
* B:静态方法:当前类名.class
*
* B:同步代码块使用的锁是:
* 任意对象
*
* 如果想既安全有要求效率高,可以使用双重判断来解决。
* @return
*/
public static Pig getInstance(){
if(instance==null){
synchronized (Pig.class) {
if(instance==null){
instance=new Pig();
}
}
}
return instance;
}
}