• 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 }
  • 相关阅读:
    windows环境python2.7安装MySQLdb
    查找文件中除了注释以外的中文
    python2的reload模块
    虚拟机网络连接NAT模式,本地用Xshell连接
    PHP中逻辑运算符的高效用法---&&和||
    mysql 的 alter table 操作性能小提示
    MySQL优化指南
    UTF-8的BOM含义
    MySQL中 指定字段排序函数field()的用法
    MySQL PROFILE 跟踪语句各阶段性能开销
  • 原文地址:https://www.cnblogs.com/fankongkong/p/5519864.html
Copyright © 2020-2023  润新知