美文网首页
单例创建&线程安全问题

单例创建&线程安全问题

作者: 王小杰at2019 | 来源:发表于2019-01-23 18:10 被阅读3次

/**
 * 线程安全的
 */
public class Example1 {
    private  Example1(){}
    private static Example1 example1 = new Example1();

    public static Example1 getInstance() {
        return example1;
    }

}

import lombok.extern.slf4j.Slf4j;

/**
 * 线程不安全安全的
 * <p>
 * 线程A 执行到  example = new Example2();还未执行完,
 * 线程B执行要进行 if (example == null)判断,最后可能创建多个实例
 */
@Slf4j
public class Example2 {
    private Example2() {
    }

    private static Example2 example;


    public static Example2 getInstance() {
        if (example == null) {
            example = new Example2();
        }
        return example;
    }

}

import lombok.extern.slf4j.Slf4j;

/**
 * 线程不安全安全的,性能低
 * 每次获取实例都要获取锁性能比较低,
 * 线程A创建了实例,但未写入到主内存中,这时候线程B读到的值便是null
 */
@Slf4j
public class Example3 {
    private Example3() {
    }

    private static Example3 example;


    public static synchronized Example3 getInstance() {
        if (example == null) {
            example = new Example3();
        }
        return example;
    }

}

import lombok.extern.slf4j.Slf4j;

/**
 * 线程不安全的,性能高
 * * 在实例化的情况下不需要每次都获取锁,性能比较好,但是同样线程不安全的,
 * * 线程A创建了实例,但未写入到主内存中,这时候线程B读到的值便是null
 */
@Slf4j
public class Example4 {
    private Example4() {
    }

    private static Example4 example;


    public static Example4 getInstance() {

        if (example == null) {
            synchronized (Example4.class) {
                if (example == null) {
                    example = new Example4();
                }
            }
        }
        return example;
    }

}

import lombok.extern.slf4j.Slf4j;

/**
 * 线程安全的,性能高
 * 在实例化的情况下不需要每次都获取锁,性能比较好,但是同样线程不安全的,
 * 线程A创建了实例,由于变量使用volatile修饰,赋值后会立即写入到主内存,这时候线程B在读的时候也会从主内存中读取
 */
@Slf4j
public class Example5 {
    private Example5() {
    }

    private volatile static Example5 example;

    public static Example5 getInstance() {

        if (example == null) {
            synchronized (Example5.class) {
                if (example == null) {
                    example = new Example5();
                }
            }
        }
        return example;
    }

}

import lombok.extern.slf4j.Slf4j;

/**
 * 使用枚举
 */
@Slf4j
public class Example6 {
    private Example6() {
    }


    public final static Example6 getInstance() {
        return Example6Enum.INSTANCE.getExample6();
    }

    enum Example6Enum {

        INSTANCE(new Example6());
        private Example6 example6;

        Example6Enum(Example6 example6) {
            this.example6 = example6;
        }

        public Example6 getExample6() {
            return example6;
        }
    }
}

相关文章

  • 单例创建&线程安全问题

  • 多线程Debug窥探单例模式

    1. 懒汉式单例模式 通过延迟初始化,降低单例创建期间的资源开销。 懒汉式单例实现,存在线程安全问题 线程任务 在...

  • 05.单例模式(创建型)

    创建型模式-单例模式 一、饿汉式单利模式 饿汉式不需要考虑线程安全问题。 饿汉式比较浪费资源 二、懒汉式单例模式 ...

  • 单例模式(Singleton)

    一、初始化单例类时即创建单例 饿汉式:(线程安全) 枚举类型:(线程安全) 二、按需、延迟创建单例 懒汉式:(线程...

  • 设计模式——单例模式的破坏

    概述: 之前学习了单例模式的几种实现,解决了多线程情况下,单例的线程安全问题,保证了单例的实现。但是单例模式在下面...

  • Java-单例模式-线程安全问题

    单例设计模式:懒汉式(延迟加载 等你需要的时候再创建对象 在多线程中会出现安全问题):解决安全问题 加了同步操作 ...

  • Singleton 单例模式

    饿汉式单例模式 饿汉式单例模式 通过静态代码块增加异常处理 懒汉式单例模式 存在线程安全问题 懒汉式单例模式 解决...

  • iOS_单例模式

    基本模式创建单例 GCD 创建单例 线程安全。 满足静态分析器的要求。 兼容了ARC

  • 单例模式之双重检查的演变

    前言 单例模式本身是很简单的,但是考虑到线程安全问题,简单的问题就变复杂了。这里讲解单例模式的双重检查。 单例模式...

  • 单例模式的懒汉式 和饿汉式

    1、懒汉式,在第一次调用的时候实例化自己,懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的, //懒汉式单例...

网友评论

      本文标题:单例创建&线程安全问题

      本文链接:https://www.haomeiwen.com/subject/cwssjqtx.html