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;
}

最新文章

  1. linux date时区修改
  2. 奥迪--Q5
  3. 决策树的基本ID3算法
  4. Linux vi 中搜索关键字
  5. UITextView -- 基础备忘
  6. Delphi调试DLL 不能调试 不能进入调试 注意!!!
  7. org.springframework.beans.factory.BeanDefinitionStoreException异常
  8. POPTEST老李分享DOM解析XML之java
  9. 修改wampsever默认密码
  10. 201521123039 《java程序设计》第三周学习总结
  11. LeetCode 594. Longest Harmonious Subsequence (最长的协调子序列)
  12. Java Volatile关键字 以及long,double在多线程中的应用
  13. IOS https抓包及10.3.3版本证书不生效问题解决
  14. leetcode1010
  15. .17-浅析webpack源码之compile流程-入口函数run
  16. CAS (12) —— CAS TicketRegistry使用JPA方案数据源c3p0与JNDI
  17. 2018软工实践—Beta冲刺(6)
  18. Android集成银联支付,提示java.lang.UnsatisfieldLinkError错误
  19. win7下安装centos6.5后,开机无法进入选择双系统启动界面,只能启动centos的解决办法
  20. 你真的认为iphone只是一部手机么

热门文章

  1. buuctf admin writeup
  2. pandas库笔记
  3. java内存模型中工作内存并不一定会同步主内存的情况分析
  4. Deeplearning.ai课程笔记-改善深层神经网络
  5. Bugku-CTF社工篇之社工进阶
  6. Python的基础知识,不同于其他编程语言
  7. ES2.3.5版本的数据类型
  8. 解决maven 在intellij IDEA 下载依赖包速度慢的问题
  9. Python学习笔记010
  10. 利用 Jenkins 持续集成 iOS 项目,搭建自动化打包环境