1、单例设计模式

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 }
原文地址:https://www.cnblogs.com/fankongkong/p/5519864.html