关于单例模式的想法-volatile

今天看着一个多线程并发用到的关键字:volatile,看了不少资料发现这个是一个共享的直接写入内存使用的关键字修饰变量,用来修饰类变量或者类静态变量,所以有了一个关于单利模式的想法,我们都知道的单例模式的一个写法是:

class Singleton{
    private static Singleton instance = null;

    private Singleton() {

    }

    public static Singleton getInstance() {
        if(instance==null) {
            synchronized (Singleton.class) {
                if(instance==null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

  当然单例模式还有其他的写法,我要说的是将关键字volatile加在变量instance上:

class Singleton{
    private volatile static Singleton instance = null;

    private Singleton() {

    }

    public static Singleton getInstance() {
        if(instance==null) {
            synchronized (Singleton.class) {
                if(instance==null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

  因为用votalite修饰的变量,在修改时是直接将变量值写进物理内存中去的,不会写入缓存中去,这样,单例模式就更加的,,,,好了

时间: 2024-10-16 17:02:31

关于单例模式的想法-volatile的相关文章

单例模式中的volatile关键字

在之前学习了单例模式在多线程下的设计,疑惑为何要加volatile关键字.加与不加有什么区别呢?这里我们就来研究一下.单例模式的设计可以参考个人总结的这篇文章 ??背景:在早期的JVM中,synchronized存在巨大的性能开销.因此,有人想出了一个"聪明"的技巧:双重检查锁定(Double-Checked Locking).人们想通过双重检查锁定来降低同步的开销.下面是使用双重检查锁定来实现延迟初始化的示例代码. public class DoubleCheckedLocking

单例模式、双检测锁定DCL、volatile详解

单例模式最要关心的则是对象创建的次数以及何时被创建. Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图).但是如果在"对象创建的次数以及何时被创建"这两点上较真起来,Singleton模式可以相当的复杂,比头五种模式加起来还复杂,譬如涉及到DCL双锁检测(double checked locking)的讨论.涉及到多个类加载器(ClassLoader)协同时.涉及到跨JVM(集群.远程EJB等)时.涉及到单例对象被销毁后重建等.对于复杂的情况

单例模式、双检测锁定DCL、volatile(转)

单例模式最要关心的则是对象创建的次数以及何时被创建. Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图).但是如果在“对象创建的次数以及何时被创 建”这两点上较真起来,Singleton模式可以相当的复杂,比头五种模式加起来还复杂,譬如涉及到DCL双锁检测(double checked locking)的讨论.涉及到多个类加载器(ClassLoader)协同时.涉及到跨JVM(集群.远程EJB等)时.涉及到单例对象被销毁后重建 等.对于复杂的情况,本章

volatile的适用场景

介绍 把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility). 原子性意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护.从而防止多个线程在更新共享状态时相互冲突. 所谓原子性操作是指不会被线程调度机子打断的操作,这种操作一旦开始,就一直到幸运星结束,中间不会有任何切换(切换线程). 可见性则更为微妙,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程

Android 单例模式探讨

Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图).但是如果在"对象创建的次数以及何时被创建"这两点上较真起来,Singleton模式可以相当的复杂,比头五种模式加起来还复杂,譬如涉及到DCL双锁检测(double checked locking)的讨论.涉及到多个类加载器(ClassLoader)协同时.涉及到跨JVM(集群.远程EJB等)时.涉及到单例对象被销毁后重建等. 目的: 希望对象只创建一个实例,并且提供一个全局的访问点. 图6.

Android 设计模式 之 单例模式

http://blog.csdn.net/fangchongbory/article/details/7734199 目录(?)[+] 单例模式常见情景 首先实现1中的单例模式A 实现2中单例模式B 实现3单例模式C 实现4单例模式D 可带参数单例模式E 终极版单例模式F android中源码单例模式举例 日历模块 Collator类 Editable类 AccessibilityManager类 1.单例模式常见情景 设计模式中,最简单不过的就是单例模式.先看看单例模式 原文:http://w

探索设计模式之----单例模式

Singleton模式可以是很简单的,它的全部只需要一个类就可以完成.但是如果在"对象创建的次数以及何时被创建"这两点上较真起来,Singleton模式可以相当的复杂. 结构是简单的,只是我们还有一些小小的要求如下: 1.最基本要求:每次从getInstance()都能返回一个且唯一的一个对象. 2.稍微高一点的要求:希望这个方法能适应多线程并发访问. 3.再提高一点的要求:方法性能尽可能高. 4.最后一点要求是:希望实现懒加载(Lazy Load),在需要的时候才被构造. 目的:希望

volatile -- 最轻量级的同步机制

特性 保证变量对所有线程的可见性 -- 即当一条线程改变了该变量的值,其他线程立刻得知 禁止了指令重排序优化 Java内存模型实现volatile load + use 必须连续一起出现,这就保证了线程从主内存读到的值是最新的值 assign + store + write必须连续一起出现,这就保证了线程修改的值必须立刻更新到主内存 对于两个变量A和B,如果先对A执行了use或assign操作,那么就要比对B先执行read或write操作,这保证了指令不能重排序 并发不安全 虽然volatile

你真的了解 volatile 关键字吗?

今天,让我们一起来探讨 Java 并发编程中的知识点:volatile 关键字 本文主要从以下三点讲解 volatile 关键字: volatile 关键字是什么? volatile 关键字能解决什么问题?使用场景是什么? volatile 关键字实现的原理? volatile 关键字是什么? 在 Sun 的 JDK 官方文档是这样形容 volatile 的: The Java programming language provides a secondmechanism, volatile f