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());
}
}
输出结果
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB1kMNR0T5tGROBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4cDO1QDO1YTM3EzNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)