java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > static实现单例模式

基于Java利用static实现单例模式

作者:灵剑山真人

这篇文章主要介绍了基于Java利用static实现单例模式,当在多个线程同时触发类的初始化过程的时候static不会被多次执行,下面我们一起进入文章看看具体要的原因

一、之前旧的写法

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

就利用Sington.getInstace就可以了,获得的是同一个实例。

上面那个代码有两个优点:

二、static代码块的效果

先来看一段代码:

 

class StaticClass{
    private static int a = 1;
    static{
        System.out.println("语句1");
        System.out.println("语句2");
    }
    static{
        System.out.println("语句3");
        System.out.println("语句4");
    }
}

当在多个线程同时触发类的初始化过程的时候(在初始化过程,类的static变量会被赋值为JVM默认值并且static代码块会被执行),为什么static不会被多次执行?因为有可能两个线程同时检测到类还没被初始化,然后都执行static代码块,结果就把语句1234多打印了,为什么上述情况不会发生。

Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Class.forName("StaticClass");//这一行触发类的初始化导致静态代码块执行
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        });
        thread1.start();
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Class.forName("StaticClass");//同样
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        });
        thread2.start();

结果如下:

语句1
语句2
语句3
语句4

有一段英文对其进行了解释:

static initialization block can be triggered from multiple parallel threads (when the loading of the class happens in the first time), Java runtime guarantees that it will be executed only once and in thread-safe manner + when we have more than 1 static block - it guarantees the sequential execution of the blocks, 也就是说,java runtime帮我们做了两件事:

三、单例的另一种写法

有了对static的知识的了解之后,我们可以写出这样的单例模式:

class Singleton{
    private Singleton() {}
    private static class NestedClass{
       static Singleton instance = new Singleton();//这条赋值语句会在初始化时才运行
    }
    public static Singleton getInstance() {
        return NestedClass.instance;
    }
}

四、总结

如果不知道static的基础知识和虚拟机类加载的知识,我可能并不会知道这一种方法。理论永远先行于技术,要学好理论才能从根本上提升自己。

到此这篇关于基于Java利用static实现单例模式的文章就介绍到这了,更多相关static实现单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文