zoukankan      html  css  js  c++  java
  • 单例模式

    1.单例模式:

      这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象创建。这个类提供一种访问方式访问其唯一的对象的方式,

      可以直接访问,不需要实例化该类对象。

    2.特点:

      1.单例类只能有一个实例。

      2.单例类必须自己创建自己的唯一实例。

      3.单例类必须给所有其他对象提供这一实例。

    3.实现方法:

      许多人可能值记得懒汉式和饿汉式,但是最好尽可能全记住,不然面试官问你还有没有其他的那就哑然了。

      (1)懒汉式:线程不安全,加锁会影响效率

     1 public class LSingle {
     2     private static LSingle single;
     3     //私有的无参构造器一定要存在:不想用别人用new的方法创建对象
     4     private LSingle() {}
     5     //加锁解决线程不安全问题但是影响效率
     6     public static /*synchronized*/ LSingle getSingle() {
     7         if(single==null)single = new LSingle();
     8         return single;
     9     }
    10 
    11 }

      (2)饿汉式:线程安全,在类加载中初始化,浪费内存

    1 public class ESingle {
    2     private static ESingle single = new ESingle();
    3         //必须存在私有构造器
    4     private ESingle() {}
    5     public static ESingle getSingle() {
    6         return single;
    7     }
    8 
    9 }        

      (3)双重校验锁:采用双锁机制,安全且在多线程的情况下保持高性能,但是不易实现

     1 public class DoubleLockSingle {
     2     private static DoubleLockSingle single;
     3     //必须存在私有构造器
     4     private DoubleLockSingle() {}
     5     public static DoubleLockSingle getSingle() {
     6         if(single==null) {
     7             synchronized(DoubleLockSingle.class) {
     8                 if(single==null) {
     9                     single = new DoubleLockSingle();
    10                 }
    11             }
    12         }
    13         return single;
    14     }
    15 
    16 }

      (4)静态内部类/登记式:线程安全,和双锁机制效果一样,实现更简单,只是有于静态域

    public class StaticSingle {
        private static class InnerSingle{
            //常量:直接调用
            private static final StaticSingle single = new StaticSingle();
        }
        public static StaticSingle getSingle() {
            return InnerSingle.single;
        }
    }

      (5)枚举:线程安全,实现容易,是实现单例模式的最佳方法,支持自动系列化机制防止多次序列化,但是使用的少

    1 //枚举类
    2 public enum EnumSingle {
    3     single;
    4     public void whateverMethod() {  
    5     }  
    6 }
  • 相关阅读:
    bootstrap fileinput 无法显示中文bug
    js防止回车(enter)键提交表单及javascript中event.keycode
    php 生成唯一随机码
    thinksns 分页数据
    详解PHP处理密码的几种方式
    windows7 在cmd中执行php脚本
    php 无限级分类 递归+sort排序 和 非递归
    CentOS 创建SVN 服务器,并且自动同步到WEB 目录
    微擎笔记
    laravel php框架 知识点及注意问题
  • 原文地址:https://www.cnblogs.com/spring-effort/p/11553443.html
Copyright © 2011-2022 走看看