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

    一、枚举类实现单例(线程最安全的一种,但是使用的比较少)

    public enum InstanceTest {
         instance;
         public void test(){
             System.out.println("这是一个枚举类型的单例!");
         }
     }

    二、静态内部类实现单例(线程安全的)

     public class InstanceTest {
         private InstanceTest(){}
         
         private static class single{
             private static final InstanceTest instance=new InstanceTest();
         }
         
         public InstanceTest getInstance(){
             return single.instance;
         }
     }

    当类加载器加载该类时,静态内部类首先不会被加载,当调用getInstance方法时,由于要使用静态内部类的instance属性,此时才会去加载静态内部类,所以会延迟加载。

    三、饿汉式单例

    public class InstanceTest {
         private InstanceTest(){}
         
         private static InstanceTest instance=new InstanceTest();
         
         public static InstanceTest getInstance(){
             return instance;
         }
     }

    线程安全的,该类第一次加载时就会创建一个实例,并发访问时一直是同一个实例所以是线程安全的,但实例的创建是依赖参数或者配置文件的,在getInstance()之前必须调用某个方法设置参数给它时该方式就行不通了。

    四、懒汉式单例(线程不安全的)

    public class InstanceTest {
         private InstanceTest(){}
         
         private static InstanceTest instance=null;
         
         public static InstanceTest getInstance(){
             return instance=new InstanceTest();
         }
     }

    多个线程访问时,调用getInstance方法,可能创建不同的实例,所以不是线程安全的,加同步代码块的话会对性能有一定的影响。

    双检锁式单例在java中存在问题,由于java的内存模型,java的内存模型存在无序写入问题

    参考博客 http://blog.csdn.net/chenchaofuck1/article/details/51702129

  • 相关阅读:
    CDQ分治·学习笔记
    高斯消元板子
    [HEOI2012]朋友圈
    [CTSC2008]祭祀
    Medium | LeetCode 140. 单词拆分 II | 回溯(递归)
    Hard | LeetCode 212. 单词搜索 II | 回溯 + 前缀树
    Medium | LeetCode 131. 分割回文串 | 回溯 + 动态规划预处理
    Hard | LeetCode 329. 矩阵中的最长递增路径 | 矩阵+DFS
    Hard | LeetCode 76. 最小覆盖子串 | 滑动窗口
    Medium | LeetCode 130. 被围绕的区域 | 矩阵 + DFS
  • 原文地址:https://www.cnblogs.com/coderising/p/5886613.html
Copyright © 2011-2022 走看看