1单例设计模式
在一个类中只存在此类的唯一对象被共享。
2 类比
我们假设一个家庭里面只有一个厕所WC,那个作为厕所类,WC在整个家庭里面是唯一的,如果我们要去用WC,那么家庭成员的人员应该排队去用WC。
3 代码
3.1 饿汉模式(线程安全,在某些条件下会耗费内存)
1 public class SingleWC { 2 //饿汉模式 3 private static SingleWC singleWc = new SingleWC(); 4 5 //私有构造函数 6 private SingleWC(){} 7 8 public static SingleWC getInstance() { 9 return singleWc; 10 } 11 12 }
3.2 懒汉模式(线程不安全)
1 public class SingleWC{ 2 private static SingleWc singleWC;
private SingleWC(){} 3 public static SingleWC getInstance(){ 4 if(SingleWC == null) 5 singleWC = new SingleWC(); 6 return singleWC; 7 } 8 }
3.2.1 通过在方法上加上synchronized保证同步
public class SingleWC{ private static SingleWC singleWC; private SingleWC(){} public static synchronized SingleWC getInstance(){//添加关键字synchronized保证同步 if(SingleWC == null) singleWC = new SingleWC(); return singleWC; } }
缺点:在方法上添加了synchronized关键字保证同步,由于被修饰的方法是一个同步快,同步块在已经进入的线程执行完之前,会阻塞后面其他线程的进入,保证了线程的安全。但是由于每次都会同步,因此极大的影响了性能,因为大多数的情况下是不需要同步的。
3.2.2 双重校验锁
public class SingleWC{ private volatile static SingleWC singleWC;
//使用volatile保证多线程对实例的可见性,避免实例初始化时属性没有赋值时,被另外线程调用 private SingleWC(){} public static SingleWC getInstance(){//添加关键字synchronized保证同步 if(singleWC == null){
//同步代码块(对象未初始化时,使用同步代码块,保证多线程第一次访问对象时,第一个多线程进入时,其他线程阻塞等待,实例不被重复创建)
synchronized(SingleWC.class){
if(singleWC == null)
singleWC = new SingleWC();
}
} return singleWC; } }
3.2.3 静态内部类
1 public class SingleWC{ 2 private SingleWC() {} 3 private static class LazyHolder{ 4 private static final SingleWC singleWC = new SingleWC(); 5 } 6 public static final SingleWC getInstance(){ 7 return LazyHolder.singleWC; 8 } 9 }