Java16-3 单例设计模式下的多线程访问

当一个单例设计模式被多线程并发访问时,也会出现安全问题。

懒汉式单例设计模式(推荐使用)

不会因为同步而出现安全问题
有共享数据,但没有多条语句操作只有一个Return

//饿汉式单例设计模式
class Single{
    private static final Single SINGLE_INTSTANCE=new Single();
    private Single(){}
    public static Single getInstance(){
        return SINGLE_INTSTANCE;
    }
}
class SingleDemo implements Runnable{
    @Override
    public void run() {
        Single.getInstance();//这个单例设计模式会被多线程并发访问
        //每个多线程都只能创建一个对象
    }
}
public class DanDemo {
    public static void main(String[] args) {
        Single a1= Single.getInstance();
    }
}

懒汉式 延迟加载模式(面试问题)

有多条语句操作 存在安全问题
结局
添加synchronized关键字定义类无法解决判断锁次数过多消耗资源问题
解决通过同步代码块外面套if循环

//懒汉式单例设计模式(面试)
//
class Single1{
    private static Single1 s=null;
    public static Single1 getInstance() {
        if (s == null) {
            //Thread-0正常进入 到创建对象时cpu跳转 无法同步
            // 此时跳回Thread-0创建对象 再无法进入外部if循环因为s不为null
            synchronized (Single1.class) {//锁为字节码对象
                if (s == null) {
                    s = new Single1();
                }
            }
        }
                return s;
    }
}
class SingleDemo1 implements Runnable{
    @Override
    public void run() {
        Single1.getInstance();//这个单例设计模式会被多线程并发访问
        //每个多线程都只能创建一个对象
    }
}
public class DanDemo_1 {
    public static void main(String[] args) {
        Single1 s1=Single1.getInstance();
    }
}

你可能感兴趣的:(Java16-3 单例设计模式下的多线程访问)