两种单列模式

public class Singleton {
    private static Singleton instance=new Singleton();
    private Singleton(){
        
    }
    public static Singleton getInstance(){
        return instance;
    }
}

注解:初试化静态的instance创建一次。如果我们在Singleton类里面写一个静态的方法不需要创建实例,它仍然会早早的创建一次实例。而降低内存的使用率。

缺点:没有lazy loading的效果,从而降低内存的使用率。

 

public class Singleton {
    private Singleton(){
        
    }
    private static class SingletonHolder{
        private final static Singleton instance=new Singleton();
    }
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}
注解:定义一个私有的内部类,在第一次用这个嵌套类时,会创建一个实例。而类型为SingletonHolder的类,只有在Singleton.getInstance()中调用,由于私有的属性,他人无法使用SingleHolder,不调用Singleton.getInstance()就不会创建实例。
优点:达到了lazy loading的效果,即按需创建实例。

//双重校验 锁 适合多线程
public class Singleton_volatile {
    
 private volatile static Singleton_volatile instance=null;
 private Singleton_volatile(){
  
 }
 public static Singleton_volatile getInstance(){
  //先检查实例是否存在,如果不存在才进入下面的同步块
  if(instance==null){
   //同步块,线程安全的创建实例
   synchronized(Singleton_volatile.class){
    //再次检查实例是否存在,如果不存在才真正的创建实例
    if(instance==null){
     instance=new Singleton_volatile();
    }
   }
  }
  return instance;
 }
}

static:静态修饰符,被static修饰的变量和方法类似于全局变量和全局方法,可以在不创建对象时调用,当然也可以在创建对象之后调用。常见的可以用于工具类的工具方法中等,譬如:Math类中的绝大多数方法都是静态方法,他们扮演了工具方法的作用。

public:声明当前被修饰的对象、方法、变量为公有的。这里的公有指的是可以被公有访问,举个例子:一个类就像是一台电脑,公有的部分就是除去电脑本身之外用户可见的部分,譬如:你知道点击哪里可以登录QQ,摁哪里可以开关机,等等,你可以使用这个类所有的可见的东西都是被声明为public的,公有可见且公有可被访问的。

private:声明当前被修饰的变量、方法为私有的。这里的私有指的是仅仅可以被私有访问,举个例子:一个类就像是一台电脑,私用的部分就是除去电脑本身之外用户不可见的部分,譬如:你知道点击哪里可以登录QQ,但是内部到底是怎么登录的QQ你是不知道的,你知道摁哪里可以开关机,但是内部是怎么开关机的你是不知道的,等等,你在使用这个类时那些这个类的确有但是你访问是非法的方法或者变量是被声明为private的,私有不可见且不可访问的。

所以,被private static修饰的属性仅仅可以被静态方法调用,但是只能被本类中的方法(可以是非静态的)调用,在外部创建这个类的对象或者直接使用这个类访问都是非法的。被public static修饰的属性除了可以被静态方法和非静态调用之外,还可以直接被类名和外部创建的对象调用。

综上呢,private static是合法的,且有着其独到的用处:为静态方法提供私有静态属性。public static常用的是为该类提供对外暴露即可以被类名直接调用的静态常量。

posted on 2017-04-13 23:22  zhuanagyan  阅读(181)  评论(0编辑  收藏  举报

导航