单例模式能用volatile修饰方法吗

最近在面试时,遇到一个面试题要求写一个单例模式,我用的是懒汉式,但是没有加上同步synchronized,面试官跟这个单例在多线程有问题,要加上volatile修饰方法。我在网上搜下标准的都是拥synchronized修饰,问下如果用volatile,所有的线程可以共享单例修改对象,这样还是不是单例模式呢?实际情况是不是可以这样做,毕竟效率比synchronized高多了

public class Singleton{

private static volatile Singleton instance;  

private Singleton(){  
}  

public static  Singleton getInstance(){  

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

}

volatile能够保证可见性,并不能保证同步,但是volatile还有一个功能就是能够禁止cpu指令排序,因此在使用双检查锁的时候需要将变量声明为volatile的,不然可能会出异常

缺点:避免的上面方式的明显缺点,但是java内存模型(jmm)并不限制处理器重排序,在执行instance=new Singleton();时,并不是原子语句,实际是包括了下面三大步骤:
1.为对象分配内存
2.初始化实例对象
3.把引用instance指向分配的内存空间
这个三个步骤并不能保证按序执行,处理器会进行指令重排序优化,存在这样的情况:
优化重排后执行顺序为:1,3,2, 这样在线程1执行到3时,instance已经不为null了,线程2此时判断instance!=null,则直接返回instance引用,但现在实例对象还没有初始化完毕,此时线程2使用instance可能会造成程序崩溃。
现在要解决的问题就是怎样限制处理器进行指令优化重排。
5.volatile double check 懒汉模式
在JDK1.5之后,使用volatile关键字修饰instance就可以实现正确的double check单例模式了

http://blog.csdn.net/glory1234work2115/article/details/50814419

volatile 的作用,简单说就是在java中一条语句,在多线程条件下,在我们看来要么被执行完成,要么没被执行;

可现实情况是,编译器可能把这条语句翻译成多条执行语句,多线程下,可能出现这条java语句被执行一半后又被切到另外的线程去执行的情况。

而这会导致一些未知的问题,所以Java引入了volatile关键字,保证一条执行语句执行过程的原子性:要么被执行完毕,要么没被执行。

前几天刚看到的,个人理解,不知道你听明白没