Java中实现线程安全的单例模式


  

引言:

使用java中的同步机制可以将单例模式中的“懒汉式”改写为线程安全的。而“饿汉式”单例模型本身就是线程安全的。

本身就是线程安全的“饿汉式”单例模式

class Bank {
    //1.私有化类的构造器
    private Bank() {}
    //2.内部创建该类的对象
    //4.要求此对象也必须声明为静态的
    private static Bank instance = new Bank();
    //3.提供公共的静态方法,返回类的对象
    public static Bank getInstance() {
        return instance;
    }
}

非线程安全的“懒汉式”单例模式

class Bank {
    //1.私有化类的构造器
    private Bank() {}

    //2.声明当前类对象,没有初始化
    //4.此对象也必须声明为static的
    private static Bank instance = null;

    //3.声明public、static的返回当前类对象的方法
    public static Bank getInstance() {
        if (instance == null) {
            instance = new Bank();
        }
        return instance;
    }
}

利用同步机制将“懒汉式”单例模式改写成线程安全的

  1. 同步代码块,显式给出同步监视器(同步锁)
class Bank {
    private static Bank instance = null;

    private Bank() {}

    private static Bank getInstance() {
        /*方式一:效率稍差
        synchronized (Bank.class) {
            if (instance == null) {
                instance = new Bank();
            }
            return instance;
        }
        */
        //方式二:效率更好
        if (instance == null) {
            synchronized (Bank.class) {
                if (instance == null) {
                    instance = new Bank();
                }
            }
        }
        return instance;
    }
}
  1. 同步方法
class Bank {
    private static Bank instance = null;

    private Bank() {}

    //此时该同步方法的同步监视器(锁)为该类本身
    private static synchronized Bank getInstance() {
        if (instance == null) {
            instance = new Bank();
        }
        return instance;
    }
}

文章作者: YangChongZhi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YangChongZhi !
评论
 上一篇
Java中线程的死锁问题 Java中线程的死锁问题
   引言: java开发中当某些逻辑设计得不合理时,将会出现“线程死锁”的问题。 线程死锁 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁 出现死锁后,不会出现异常,不会出现提示,只是
2021-01-06
下一篇 
Java中的线程安全问题及解决方案 Java中的线程安全问题及解决方案
   引言: 多个线程执行的不确定性可能会引起执行结果的不稳定。多个线程对共享数据的操作可能会破坏数据的完整性。 当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共
2021-01-06
  目录