天天看点

java创建单例模式java创建单利模式

java创建单利模式

1、为什么要创建单利模式?

因为单例模式保证一个类中只存在一个实例,有利于节省内存,有利于java垃圾回收

2、 常见三种单例模式的创建

1).懒汉式单例模式

public class People {
public synchronized static People getInstance(){
        if(instance==null){
            instance=new People();
        }
        return instance;
    }
    private People(){

    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
           

这种写法在getInstance()方法中加入了synchronized锁。能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是效率很低(因为锁),并且大多数情况下不需要同步。

2).饿汉式单例模式

public class People {
  private static People instance=new People();
    private People(){

    }
    public  static People getInstance(){
        return instance;
    }
	private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    }
           

这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,这时候初始化instance显然没有达到lazy loading的效果。

3).静态类部类模式

public class People {
 private static class Instance{
        private static People instance=new People();

    }
    public  static People getInstance(){
        return Instance.instance;
    }



    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    }
           

这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第二种不同的是(很细微的差别):第二种是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,如果不希望在Singleton类加载时就实例化,因为不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三方法就显得更合理。

测试类

public class PeopleTest {
public static void main(String[] args){
People p1=People.getInstance();
        p1.setName("张三");
        People p2=People.getInstance();
        p2.setName("李四");
        System.out.println(p1.getName());
        System.out.println(p2.getName());
   }
}
           

输出结果

java创建单例模式java创建单利模式

继续阅读