//形式1-静态常量-newclassA{//私有静态属性-直接初始化privatestaticfinalA a =newA();//私有构造函数publicA(){}//提供访问方法publicstaticAgetInstance(){return a;}}//形式2-静态常量-静态代码块classB{//私有静态属性privatestaticfinalB b;//私有构造函数privateB(){}//静态代码块中,初始化static{
b =newB();}//提供访问方法publicstaticBgetInstance(){return b;}}publicclassTest{publicstaticvoidmain(String[] args){System.out.println(A.getInstance());System.out.println(B.getInstance());}}
2.双重检查锁
优:懒加载、线程安全
缺:需要理解能力
注意:需要加 volatile 关键字,禁止重排序发生。
实现 1.私有构造函数,私有静态属性 2.方法内先写两个判断,最后一行是返回值 3.中间加类锁
classX{//私有静态属性privatestaticvolatileX x;//私有构造函数privateX(){}publicstaticXgetInstance(){//一重检查if(x ==null){//加锁synchronized(X.class){//二重检查if(x ==null){
x =newX();}}}return x;}}//双重检查锁publicclassTest2{publicstaticvoidmain(String[] args){System.out.println(X.getInstance());}}
3.静态内部类
JVM类加载机制保证,类的静态属性,只会在第一次加载类的时候初始化
优:懒加载,线程安全
缺:代码有点多
实现: 1.先写两个类(一个普通类O,一个静态内部类P) 2.再写两个方法,一个私有内部构造方法,一个静态的获取供实例的方法 3.静态内部类O,写一个直接new O 的静态属性,在外部方法中返回
//1.先写两个类(一个普通类O,一个静态内部类P)classO{//2.再写两个方法,一个私有内部构造方法,一个静态的获取供实例的方法privateO(){}//1.先写两个类(一个普通类O,一个静态内部类P)staticclassP{//3.静态内部类O,写一个直接new O 的静态属性,在外部方法中返回publicstaticfinalO o =newO();}//2.再写两个方法,一个私有内部构造方法,一个静态的获取供实例的方法publicstaticOgetInstance(){returnP.o;}}//静态内部类publicclassTest3{publicstaticvoidmain(String[] args){System.out.println(O.getInstance());}}