- static关键字
- static类或者接口:外部类不可以,内部类可以。静态内部类可以不依赖外部类对象的实例化,例如一个实现静态接口Map.Entry的内部静态类,而且只能访问外部类的静态成员和静态方法
- static代码块:只在类中。JVM加载类时执行,一般只会执行一次。
- static成员变量:静态成员变量属于类,所有对象的static变量都指向同一个内存地址
- static成员方法:静态方法不能使用this,super,非静态成员变量,非静态方法;static不可以放在构造方法之前,静态内部类、静态方法也可以访问构造方法。
class Singleton{
private volatile static Singleton singleton;
private Singleton(){};
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
class Singleton{
private Singleton(){};
private static class Holder{
private static final Singleton INSTANCE = new Singleton();
}
public static final Singleton getInstance(){
return Holder.INSTANCE;
}
}
- volatile关键字
- 为保证多线程时,对成员变量读取一致。
- 原理:一般地,编译器对于常用的变量采取缓存策略,程序在读取变量时直接读取缓存,多线程时线程之间的缓存可能不一致。增加volatile,强制编译器不使用缓存策略,程序直接从对应的内存当中提取。
- 当类中有一个成员变量时,靠volatile可以保证多线程安全;当类中有多个成员变量时,单靠volatile不可以保证多线程安全。
- 不可变类
- 不可变类指的是创建对象时,所有的成员变量就不能被修改。
- 一般地,不可变类不允许有set方法,get方法和构造方法需要对成员变量的赋值和存取采取clone模式。 如 this.date = (DateLocalTime)d.clone();
- String、Integer都是不可变类。
- 确保所有方法或者类用final修饰,保证子类不可覆写。