A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

什么是单例模式?

在文章开始之前我们还是有必要介绍一下什么是单例模式。单例模式是为确保一个类只有一个实例,并为整个系统提供一个全局访问点的一种模式方法。

从概念中体现出了单例的一些特点:

(1)、在任何情况下,单例类永远只有一个实例存在

(2)、单例需要有能力为整个系统提供这一唯一实例  

单列模式有分为,懒汉式,和饿汉式

懒汉式代码

[Java] 纯文本查看 复制代码
package cn.qw.singlemode.test;

/**
 * @author 杨钦炜  on 2019/11/6
 * @emmial [url=mailto:402481418@qq.com]402481418@qq.com[/url]
 */
public class LazySingleMode {
    private static LazySingleMode instance=null;
    private LazySingleMode(){
    }


    public static LazySingleMode getInstance(){
        if (instance==null){
            instance=new LazySingleMode();
        }
        return instance;
    }


}

测试代码

[Java] 纯文本查看 复制代码
/**
 * @author 杨钦炜  on 2019/11/6
 * @emmial [url=mailto:402481418@qq.com]402481418@qq.com[/url]
 */
public class TestSingle {
    public static void main(String[] args) {
        int count = 100;
        CountDownLatch latch = new CountDownLatch(count);
        CyclicBarrier cyclicBarrier=new CyclicBarrier(100);
        Set<Object> objects = Collections.synchronizedSet(new HashSet<Object>());

        for (int i = 0; i < count; i++) {
            // objects.add(HungrySingleMode.getInstance());
            new Thread(new Runnable() {
                @Override
                public void run() {

                    LazySingleMode instance = LazySingleMode.getInstance();
                    System.out.println("当前时间:"+System.currentTimeMillis()+"地址"+instance);
                    try {
                        latch.await();
                    }catch (Exception e){
                        e.printStackTrace();
                    }

                }
            }).start();
            latch.countDown();
        }

    }
}

结果

[AppleScript] 纯文本查看 复制代码
C:\java8\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2\lib\idea_rt.jar=2807:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2\bin" -Dfile.encoding=UTF-8 -classpath C:\java8\jre\lib\charsets.jar;C:\java8\jre\lib\deploy.jar;C:\java8\jre\lib\ext\access-bridge-64.jar;C:\java8\jre\lib\ext\cldrdata.jar;C:\java8\jre\lib\ext\dnsns.jar;C:\java8\jre\lib\ext\jaccess.jar;C:\java8\jre\lib\ext\jfxrt.jar;C:\java8\jre\lib\ext\localedata.jar;C:\java8\jre\lib\ext\nashorn.jar;C:\java8\jre\lib\ext\sunec.jar;C:\java8\jre\lib\ext\sunjce_provider.jar;C:\java8\jre\lib\ext\sunmscapi.jar;C:\java8\jre\lib\ext\sunpkcs11.jar;C:\java8\jre\lib\ext\zipfs.jar;C:\java8\jre\lib\javaws.jar;C:\java8\jre\lib\jce.jar;C:\java8\jre\lib\jfr.jar;C:\java8\jre\lib\jfxswt.jar;C:\java8\jre\lib\jsse.jar;C:\java8\jre\lib\management-agent.jar;C:\java8\jre\lib\plugin.jar;C:\java8\jre\lib\resources.jar;C:\java8\jre\lib\rt.jar;C:\springstudy\single_column_mode\out\production\single_column_mode cn.qw.singlemode.test.TestSingle
当前时间:1574306199359地址cn.qw.singlemode.test.LazySingleMode@16d7ece6
当前时间:1574306199359地址cn.qw.singlemode.test.LazySingleMode@4563ddd7
当前时间:1574306199359地址cn.qw.singlemode.test.LazySingleMode@267756c4
当前时间:1574306199359地址cn.qw.singlemode.test.LazySingleMode@4563ddd7
当前时间:1574306199359地址cn.qw.singlemode.test.LazySingleMode@4563ddd7
当前时间:1574306199360地址cn.qw.singlemode.test.LazySingleMode@4563ddd7

恶汉式

[Java] 纯文本查看 复制代码
package cn.qw.singlemode;

/**
 * @author 杨钦炜  on 2019/11/6
 * @emmial [url=mailto:402481418@qq.com]402481418@qq.com[/url]
 * 饿汉式单列
 */
public class HungrySingleMode {
    private static HungrySingleMode hungrySingleMode = new HungrySingleMode();

    private HungrySingleMode() {}

    public static HungrySingleMode getInstance() {
        System.out.println("当前时间:"+System.currentTimeMillis()+"地址"+hungrySingleMode);
        return hungrySingleMode;
    }
}

测试代码

[Java] 纯文本查看 复制代码
/**
 * @author 杨钦炜  on 2019/11/6
 * @emmial [url=mailto:402481418@qq.com]402481418@qq.com[/url]
 */
public class TestSingle {
    public static void main(String[] args) {
        int count = 100;
        CountDownLatch latch = new CountDownLatch(count);
        CyclicBarrier cyclicBarrier=new CyclicBarrier(100);
        Set<Object> objects = Collections.synchronizedSet(new HashSet<Object>());

        for (int i = 0; i < count; i++) {
            // objects.add(HungrySingleMode.getInstance());
            new Thread(new Runnable() {
                @Override
                public void run() {

                    HungrySingleMode instance = HungrySingleMode.getInstance();
                    System.out.println("当前时间:"+System.currentTimeMillis()+"地址"+instance);
                    try {
                        latch.await();
                    }catch (Exception e){
                        e.printStackTrace();
                    }

                }
            }).start();
            latch.countDown();
        }

    }
}

结果

[AppleScript] 纯文本查看 复制代码
C:\java8\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2\lib\idea_rt.jar=2866:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2\bin" -Dfile.encoding=UTF-8 -classpath C:\java8\jre\lib\charsets.jar;C:\java8\jre\lib\deploy.jar;C:\java8\jre\lib\ext\access-bridge-64.jar;C:\java8\jre\lib\ext\cldrdata.jar;C:\java8\jre\lib\ext\dnsns.jar;C:\java8\jre\lib\ext\jaccess.jar;C:\java8\jre\lib\ext\jfxrt.jar;C:\java8\jre\lib\ext\localedata.jar;C:\java8\jre\lib\ext\nashorn.jar;C:\java8\jre\lib\ext\sunec.jar;C:\java8\jre\lib\ext\sunjce_provider.jar;C:\java8\jre\lib\ext\sunmscapi.jar;C:\java8\jre\lib\ext\sunpkcs11.jar;C:\java8\jre\lib\ext\zipfs.jar;C:\java8\jre\lib\javaws.jar;C:\java8\jre\lib\jce.jar;C:\java8\jre\lib\jfr.jar;C:\java8\jre\lib\jfxswt.jar;C:\java8\jre\lib\jsse.jar;C:\java8\jre\lib\management-agent.jar;C:\java8\jre\lib\plugin.jar;C:\java8\jre\lib\resources.jar;C:\java8\jre\lib\rt.jar;C:\springstudy\single_column_mode\out\production\single_column_mode cn.qw.singlemode.test.TestSingle
当前时间:1574306345182地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345182地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345182地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345182地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345182地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345182地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345182地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345182地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345182地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345182地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345183地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345183地址cn.qw.singlemode.HungrySingleMode@267756c4
当前时间:1574306345183地址cn.qw.singlemode.HungrySingleMode@267756c4

从上面测试可以知道,懒汉模式存在线程安全问题,饿汉式则没有


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马