龙空技术网

java单例模式之内部静态类实现

35程序员老鸟 173

前言:

现时各位老铁们对“java调用静态方法”都比较看重,看官们都需要学习一些“java调用静态方法”的相关文章。那么小编也在网摘上汇集了一些关于“java调用静态方法””的相关文章,希望各位老铁们能喜欢,咱们快快来学习一下吧!

一、直接上代码,模仿FTP客户端

package com.share.test;public class FtpClientSingleton {    /**     * 私有构造函数     */    private FtpClientSingleton() {        System.out.println("我被初始化了...."+Thread.currentThread().getId());    }    public void showMsg(){        System.out.println("方法被调用...."+Thread.currentThread().getId());    }    /**     * 对外提供公共的访问方法     */    public static FtpClientSingleton getInstance() {        System.out.println("我被使用............"+Thread.currentThread().getId());        return FtpClientSingletonHolder.INSTANCE;    }    /**     * 写一个静态内部类,里面实例化外部类,jvm 类加载是单例的,只加载一次     */    private static class FtpClientSingletonHolder {        private static final FtpClientSingleton INSTANCE = new FtpClientSingleton();    }}

二、开始测试

package com.share.test;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class SpringBootWebApplication {    public static void main(String[] args) {//        FtpClientSingleton.getInstance().showMsg();//        FtpClientSingleton.getInstance().showMsg();        // 创建一个可缓存线程池        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();        for (int i = 0; i < 10; i++) {            cachedThreadPool.execute(new Runnable() {                public void run() {                    FtpClientSingleton.getInstance().showMsg();                }            });        }    }}

三、看结果

只初始化一次

四、总结

使用内部静态类方式实现单例,是懒加载方式,而且是线程安全的(jvm类加载保证线程安全)。

标签: #java调用静态方法