单例模式相关

单线程的情况下不加volatile和synchronized也是正确的单例。多线程情况下,如果你把volatile换成synchronized也是可以的,但是这样就是一个重量级,并发度会变得很差。换成volatile可以保证每个线程都可以得到instance变量的最新的值(底层的实现是,将每个线程栈桢中变量的拷贝实现,从共享区内存读取最新的值)。<br />如果不加下面的synchronized的话为什么不是线程安全的?这是因为每个对象创建会分成三步,而操作系统底层会对这个三步进行重排序,加上synchronized就会告诉操作系统不要对这三步重排序,这样保证了原子性和顺序性。(我这里面讲的比较简单,至于重排序你可以自己去查一查

public class Singleton1 {

    private static volatile Singleton1 instance = null;

    private Singleton1(){}

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

class Singleton2{

    private static Singleton2 instance = new Singleton2();

    private Singleton2(){}

    public static Singleton2 getInstance(){
        return instance;
    }
}

enum Singleton3{
    instance;

    public static void main(String[] args){
        Singleton3 s3 = Singleton3.instance;
        Singleton3 s4 = Singleton3.instance;
        System.out.println(s3 == s4);

    }

}

class Singleton4{
    private static class Lazy{
        private static Singleton4 instance = new Singleton4();
    }

    private Singleton4(){};

    public static Singleton4 getInstance(){
        return Lazy.instance;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例对象的类只能允许一个实例存在,意味着只有通过该类提供的静态方法来得到该类的唯一实例,开发过程中我们通常需要一个...
    Shimmer_阅读 382评论 2 1
  • 面试题目一:请写出多种单例模式,并说出他们的区别 答案:具体代码如下 总结:上述两种单例模式在单线程的情况下都符合...
    pr0metheus阅读 261评论 0 0
  • 一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 publicclassUnsa...
    Martin说阅读 2,264评论 0 6
  • 除了充分利用计算机处理器的能力外,一个服务端同时对多个客户端提供服务则是另一个更具体的并发应用场景。衡量一个服务性...
    胡二囧阅读 1,384评论 0 12
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,144评论 1 32