zoukankan      html  css  js  c++  java
  • 单例模式-静态内部类方式

    前言:
    上节中,我们分析了要解决线程重排序的问题,找了两种解决方案,第一种方案上节已经实现,那么我们这节就来实现第二种解决方案。
    1、不允许2、3进行重排序,加入了volatile关键字.
    2、允许一个线程进行重排序,但不允许另外线程看到他的重排序。
    大家有没有想到用静态内部类解决呢?那么我们先了解一下它吧!
    1、内部静态类解决原理:如下图1
                                                     图一
    * jvm在类的初始化阶段,也就是class被加载后,也就是被线程使用之前,都是类的初始化阶段,在这个阶段会执行类的初始化。
    * 在执行类的初始化期间呢,jvm会获取一个锁,这个锁可以同步多个线程对一个类的初始化,也就是绿色的部分,基于这个特性,
    * 我们可以实现基于静态内部类的、并且是线程安全的延迟初始化方案。
    现在我们知道了静态内部类可以不允许另外线程看到他的重排序,是利用了静态内部类具有线程安全的延迟方案的特性。
    2、线程安全的延迟方案的特性的扩展
    根据java的语言规范,假设有一个类,为A,则一个有五种方案都可以有
    线程安全的延迟方案的特性。
    A类会立刻被初始化的5种情况
    * 1、A类型的实例被创建。
    * 2、A类中声名的一个静态方法被调用。
    * 3、A类中声名的一个静态成员被赋值。
    * 4、A类中声名的一个静态成员被使用,并且静态成员不是一个常量成员。
    * 5、A类如果是一个顶级类,在类中嵌套的有断言语句,这种情况A类也会被立刻初始化。
    * 满足以上某一条件,就会立刻初始化。
    3、不允许另外线程看到他的重排序的代码
    public class StaticInnerClassSingleton {
    
        private static class InnerClass {
            private static StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();
        }
        public static StaticInnerClassSingleton getInstance(){
            return InnerClass.staticInnerClassSingleton;
        }
    }

    结束!

     
     


     
    想要飞得更高,就该忘记地平线!
  • 相关阅读:
    .ssh/config 文件的解释算法及配置原则
    不fq安装 golang tools
    iOS 组件化的几篇文章
    第一把机械键盘 ikbc C-87
    我推荐的 Java Web 学习路线
    【吐槽向】iOS 中的仿射变换
    Spring 对缓存的抽象
    Spring 事务管理笔记
    Swift 笔记汇总
    Java 类加载器
  • 原文地址:https://www.cnblogs.com/shenwen/p/10707965.html
Copyright © 2011-2022 走看看