什么是单例模式? 在文章开始之前我们还是有必要介绍一下什么是单例模式。单例模式是为确保一个类只有一个实例,并为整个系统提供一个全局访问点的一种模式方法。 从概念中体现出了单例的一些特点: (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
从上面测试可以知道,懒汉模式存在线程安全问题,饿汉式则没有
|