设计模式课程 设计模式精讲 8-2 单例设计模式-懒汉式及多线程Debug实战
1 主要内容
1.1 多线程debug
1.2 synchronized同步锁的调用
1.3 懒加载的应用
2 代码演练
2.1 单线程调用
2.2 多线程调用
2.3 锁的调用
1 主要内容
1.1 多线程debug
a 主要是在idea中,右键选择断点,选中thread,done即可。
b 使用的时候,frames选择下拉框,选择要执行的线程即可。
c 如下图所示
1.2 synchronized同步锁的调用
如2.3所示
如果锁放在静态方法上,锁的是整个class文件,如果放在非静态方法上,锁的是在堆内存中生成的对象。
详情参考 :https://blog.csdn.net/wagnteng/article/details/80529758
syncronized同步锁有加锁和开锁的开销,比较消耗资源,对性能有一定的影响。
1.3 懒加载的应用
外部类调取LazySingleton的时候才会进行初始化,所以实现了懒加载。
2 代码演练
2.1 单线程调用
测试类:
package com.geely.design.pattern.creational.singleton; public class Test { public static void main(String [] args){
//这样写异常,因为构造方法私有
// LazySingleton lazySingleton = new LazySingleton();
LazySingleton lazySingleton = LazySingleton.getInstance();
System.out.println(lazySingleton);
}
}
实体类:
package com.geely.design.pattern.creational.singleton; public class LazySingleton {
/*
属性私有,其他外部类,无法调用该属性,安全
*/
private static LazySingleton lazySingleton = null; /**
* 构造方法私有,其他类无法实例化该类
*/
private LazySingleton(){
} /**
* 这里写静态方法:因为外部类无法实例化创建出该类,
* 只能通过该类的静态方法获取到该类。
* @return
*/
public static LazySingleton getInstance(){
if(lazySingleton == null){
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
打印结果:
"C:\Program Files\Java\jdk1.7.0_79\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=3988:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_79\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\design_pattern\target\classes" com.geely.design.pattern.creational.singleton.Test
com.geely.design.pattern.creational.singleton.LazySingleton@109d3f8b Process finished with exit code 0
2.2 多线程调用
测试类:
package com.geely.design.pattern.creational.singleton; public class Test { /*public static void main(String [] args){
//这样写异常,因为构造方法私有
// LazySingleton lazySingleton = new LazySingleton();
LazySingleton lazySingleton = LazySingleton.getInstance();
System.out.println(lazySingleton);
}*/ public static void main(String [] args){
Thread thread1 = new Thread(new T());
Thread thread2 = new Thread(new T());
thread1.start();
thread2.start();
System.out.println("结束了!!!");
}
}
线程类:
package com.geely.design.pattern.creational.singleton; /**
* 注:该类为线程类,调用LazySingleton
*/
public class T implements Runnable{ @Override
public void run() {
LazySingleton lazySingleton = LazySingleton.getInstance();
System.out.println(Thread.currentThread().getName()+"==="+lazySingleton); }
}
实体类:
package com.geely.design.pattern.creational.singleton; public class LazySingleton {
/*
属性私有,其他外部类,无法调用该属性,安全
*/
private static LazySingleton lazySingleton = null; /**
* 构造方法私有,其他类无法实例化该类
*/
private LazySingleton(){
} /**
* 这里写静态方法:因为外部类无法实例化创建出该类,
* 只能通过该类的静态方法获取到该类。
* @return
*/
public static LazySingleton getInstance(){
if(lazySingleton == null){
lazySingleton = new LazySingleton();
}
return lazySingleton;
} }
打印日志1:
"C:\Program Files\Java\jdk1.7.0_79\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:4375,suspend=y,server=n -javaagent:C:\Users\weijingli\.IdeaIC2018.1\system\captureAgent\debugger-agent.jar=file:/C:/Users/weijingli/AppData/Local/Temp/capture.props -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_79\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\design_pattern\target\classes;D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar" com.geely.design.pattern.creational.singleton.Test
Connected to the target VM, address: '127.0.0.1:4375', transport: 'socket'
结束了!!!
Thread-0===com.geely.design.pattern.creational.singleton.LazySingleton@3eea8847
Disconnected from the target VM, address: '127.0.0.1:4375', transport: 'socket'
Thread-1===com.geely.design.pattern.creational.singleton.LazySingleton@3eea8847 Process finished with exit code 0
打印日志2:
Connected to the target VM, address: '127.0.0.1:4782', transport: 'socket'
结束了!!!
Thread-1===com.geely.design.pattern.creational.singleton.LazySingleton@28fa1b85
Thread-0===com.geely.design.pattern.creational.singleton.LazySingleton@57f4ea9d
Disconnected from the target VM, address: '127.0.0.1:4782', transport: 'socket' Process finished with exit code 0
2.3 锁的调用
优点:解决了多线程懒加载初始化的问题。
缺点: 多线程的时候,由于一个线程被锁,其他的线程无法访问该类,被堵塞。性能大大降低
方法1:
package com.geely.design.pattern.creational.singleton; public class LazySingleton {
/*
属性私有,其他外部类,无法调用该属性,安全
*/
private static LazySingleton lazySingleton = null; /**
* 构造方法私有,其他类无法实例化该类
*/
private LazySingleton(){
} /**
* 这里写静态方法:因为外部类无法实例化创建出该类,
* 只能通过该类的静态方法获取到该类。
* @return
*/
public static synchronized LazySingleton getInstance(){
if(lazySingleton == null){
lazySingleton = new LazySingleton();
}
return lazySingleton;
} }
方法2:
public static LazySingleton getInstance(){
synchronized (LazySingleton.class){
if(lazySingleton == null){
lazySingleton = new LazySingleton();
}
}
return lazySingleton;
}
设计模式课程 设计模式精讲 8-2 单例设计模式-懒汉式及多线程Debug实战的更多相关文章
- JAVA_SE基础——38.单例设计模式
本文继续介绍23种设计模式系列之单例模式. 我们在javaSE的基础学习中,会讲到:单例设计模式.模板设计模式.装饰者设计模式.观察者设计模式.工厂设计模式 我以后随着水平的提高,我会专门开个分类写设 ...
- 单例设计模式(Singleton)
一.单例设计模式介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法) 例如:Hibernate的Se ...
- Java设计模式—单例设计模式(Singleton Pattern)全然解析
转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...
- iOS开发之单例设计模式(完整正确版本)
单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中 ...
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
- JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖
JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...
- 【java】设计模式-单例设计模式
单例设计模式:解决一个类在内存中是存在一个对象的问题.当需要该事物的对象在内存中唯一时,将以下三步添加即可. 思想:想要保证对象唯一1.为了避免其他程序过多的建立该类对象,先禁止其他程序建立该类对象2 ...
- 【iOS 单例设计模式】底层解析与运用
[iOS 单例设计模式]底层解析与运用 一.单例设计名词解释: (官方解释)单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.(形象比喻)程序 — 公司 单例实例 - 管理 ...
- 单例设计模式全局缓存accessToken
使用微信JS-SDK开发的小伙伴们,看文档经常会看到这样一句话:(下面是微信开发文档的一部分原话截图) 这句话就是:开发者必须在自己的服务全局缓存access_token,jsapi_ticket 下 ...
随机推荐
- mybatis中条件查询大于等于和小于等于写法
原符号 < <= > >= & ' "替换符号 < <= > >= & ' " createDat ...
- PHP转换oracle数据库的date类型
今天圣诞节啊,圣诞节快乐啊! 最近遇到一个很纠结的事,就是我在plsql里面查的是这样的,很正常, 但是我用程序查出来就是这样的,啊啊啊,真是崩溃啊 但是我传数据需要上面那种格式,而且我对oracle ...
- 看 C++ Primer 的58页, 讲拷贝时不能忽略 底层const这里的说的原因有点牵强, 这里给出自己的理解
extern const int ci =42; const int * p2 = &ci; extern const int *const p3= p2; int *p= p3; ...
- AFNetworking errorCode -1016 解决方法
AFNetworking 默认是只能解析以下格式,如果需要支持data等格式,需要增加acceptableContentTypes AFNetworking.acceptableContentType ...
- TakeColor下载及调节鼠标指针不一致的问题
取色器下载链接: 链接:https://pan.baidu.com/s/19TBWZA2ltaLQjzskTipnmg 提取码:2uz3 若出现指针与鼠标不一致: TakeColor v8.0 > ...
- spring boot properties文件与yaml文件的区别
编写是没有提示的话在pom中添加依赖,如下: <!-- 配置文件处理器 编写配置时会有提示 --> <dependency> <groupId>org.spring ...
- spark wordcount程序
spark wordcount程序 IllegalAccessError错误 这个错误是权限错误,错误的引用方法,比如方法中调用private,protect方法. 当然大家知道wordcount业务 ...
- JSON 解析中遇到的坑😭
最近做加解密遇到一个很“奇葩的问题”,解析服务端加密后的字符串 序列化 时一直报错 "json解析失败:Error Domain=NSCocoaErrorDomain Code=3840 & ...
- toPlainString() 和 toString()(转载)
函数 toPlainString() 和 toString() 对于 BigDecimal b ; (b=(0.4321)^ 20) String s = b.toPlainString() ; Sy ...
- leetCode练题——14. Longest Common Prefix
1.题目 14. Longest Common Prefix Write a function to find the longest common prefix string amongst a ...