懒汉式(线程不安全)

1). 起到了懒加载的效果,但是只能在单线程下使用。

2). 如果在多线程下,一个线程进入了if(null == instance)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例,所以在多线程环境下不可使用这种方式。

3). 结论,在实际开发中,不要使用如下这种方式。

public class SingletonTest03 {public static void main(String[] args){//Singleton1 s1 = Singleton1.getSingleton1();//Singleton1 s2 = Singleton1.getSingleton1();// s1, s2是同一个实例//System.out.println(s1 == s2);//System.out.println(s1.hashCode()+"  "+s2.hashCode());T t1 = new T();new Thread(t1).start();T t2 = new T();new Thread(t2).start();}
}class T implements Runnable{public Singleton1 s1 = null;@Overridepublic void run() {try {Thread.sleep(10000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}Singleton1 s1 = Singleton1.getSingleton1();System.out.println(s1.hashCode());}
}// 懒汉式(线程不安全)
class Singleton1{// 构造器私有化,外部不能newprivate Singleton1(){}private static Singleton1 instance;// 向外部暴露一个静态的公共方法,当使用到该方法时,才去创建instance// 即懒汉式public static Singleton1 getSingleton1(){if(null == instance){instance = new Singleton1();}return instance;}
}

懒汉式(线程安全, 同步方法)

优缺点:

1). 解决了线程不安全问题.

2). 效率太低了,每个线程在想获得类的实例时候,执行getSingleton1()方法都要进行同步,而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了,方法进行同步效率太低。

3). 结论: 在实际开发中,不推荐使用这种方式。

public class SingletonTest04 {public static void main(String[] args){//Singleton1 s1 = Singleton1.getSingleton1();//Singleton1 s2 = Singleton1.getSingleton1();// s1, s2是同一个实例//System.out.println(s1 == s2);//System.out.println(s1.hashCode()+"  "+s2.hashCode());T t1 = new T();new Thread(t1).start();T t2 = new T();new Thread(t2).start();System.out.println(t1.s1 == t2.s1);}
}class T implements Runnable{public Singleton1 s1 = null;@Overridepublic void run() {try {Thread.sleep(10000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}Singleton1 s1 = Singleton1.getSingleton1();System.out.println(s1.hashCode());}
}// 懒汉式(线程安全, 同步方法)
class Singleton1{// 构造器私有化,外部不能newprivate Singleton1(){}private static Singleton1 instance;// 向外部暴露一个静态的公共方法,当使用到该方法时,才去创建instance// 即懒汉式// 加入了同步代码,解决线程不安全问题public static synchronized Singleton1 getSingleton1(){if(null == instance){instance = new Singleton1();}return instance;}
}

懒汉式(线程安全, 同步代码块)

同步代码块这种方法连线程安全问题都解决不了,这种同步并不能起到线程同步的作用。假如一个线程进入了if(null == instance)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例

public class SingletonTest05 {public static void main(String[] args){//Singleton1 s1 = Singleton1.getSingleton1();//Singleton1 s2 = Singleton1.getSingleton1();// s1, s2是同一个实例//System.out.println(s1 == s2);//System.out.println(s1.hashCode()+"  "+s2.hashCode());T t1 = new T();new Thread(t1).start();T t2 = new T();new Thread(t2).start();System.out.println(t1.s1 == t2.s1);}
}class T implements Runnable{public Singleton1 s1 = null;@Overridepublic void run() {try {Thread.sleep(10000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}Singleton1 s1 = Singleton1.getSingleton1();System.out.println(s1.hashCode());}
}// 懒汉式(线程安全, 同步方法)
class Singleton1{// 构造器私有化,外部不能newprivate Singleton1(){}private static Singleton1 instance;// 向外部暴露一个静态的公共方法,当使用到该方法时,才去创建instance// 即懒汉式// 加入了同步代码,解决线程不安全问题public static  Singleton1 getSingleton1(){if(null == instance){synchronized(Singleton1.class){instance = new Singleton1();}}return instance;}
}

设计模式:单例模式之懒汉式相关推荐

  1. 设计模式 - 单例模式(Singleton Pattern)

    单例模式 介绍 模式:创建型 意图:保证一个类只有一个实例,并提供一个访问它的全局访问点 解决:一个全局使用的类频繁地创建与销毁 场景: 唯一序列号 web中的计数器 I/O与数据库的连接 -- 实现 ...

  2. java singleton inner class_Java面向对象设计模式-单例模式

    Java面向对象设计模式-单例模式 2020-05-28 589 0 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点,有多重实现方式. 一.饿汉式单例模式,构造方法私有化,在加载类Sin ...

  3. 炒冷饭系列:设计模式 单例模式

    2019独角兽企业重金招聘Python工程师标准>>> 炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆 ...

  4. 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例

    场景 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例: 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例_霸道流氓气质的博客- ...

  5. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  6. 设计模式 -- 单例模式(Singleton)

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初始单例 ...

  7. 小视频源码,设计模式单例模式

    小视频源码,设计模式单例模式实现的相关代码 .一,单线程时候推荐 /*** Created by Shinelon on 2018/10/11.* 单利模式 懒汉式 -->单线程推荐使用*/pu ...

  8. Java 设计模式 - 单例模式

    Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录 Java 设计模式 - 单例模式 单例设计模式介绍 单例设计模式八种方式 饿汉式 - 静态常量 饿汉式( ...

  9. C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)

    C++设计模式--单例模式详解(懒汉模式.饿汉模式.双重锁) 应用场景 一.单例模式是什么? 二.使用步骤 1.UML图 2.代码实现 应用场景 通常我们在做通讯的时候,我们跟服务器数据交互,假如每次 ...

最新文章

  1. python刷题一亩三分地_手把手教你用python抓网页数据【一亩三分地论坛数据科学版】...
  2. pyinstaller python3.7_解决python3.7安装好pyinstaller却不能使用的问题
  3. 杀毒软件:看企业版与单机版之间区别
  4. 设计模式-单件模式(Singleton pattern)
  5. 分页携带请求参数_一个值得深思的小问题 请求中的参数值为空要不要携带该参数?...
  6. python 数据离散化和面元划分
  7. Hadoop框架:集群模式下分布式环境搭建
  8. 10用户账户控制只有否_【新书连载】测试工程师核心开发技术(10)—数据库体系结构...
  9. 创业需要的学习能力不是读书考试做题也不是所谓的思维格局
  10. ORACLE报错(5)ORA-01102: cannot mount database in EXCLUSIVE mode
  11. java并行调度_java并行调度框架封装及示例
  12. DragVideo,一种在播放视频时,可以任意拖拽的方案
  13. Myeclipse8.5 最新注册码以使用方法(可以用到2015年!!!)
  14. LVM报错:resize2fs: Bad magic number in super-block
  15. JavaScript参考文档
  16. android手机 hdmi,手机的高清输出——MHL和micro HDMI测试
  17. CString彻底分析,很强悍的啊
  18. 装系统后恢复U盘容量
  19. 《第六周RFID作业》物联112118 林家辉
  20. SOA RPC SOAP REST

热门文章

  1. FastJson乱序问题
  2. 大数据笔记(六)——HDFS的底层原理:JAVA动态代理和RPC
  3. sqoop导入数据到hive中元数据问题
  4. 使对象具有ES6中Iterator接口的实现方法
  5. 【转】HTTP Response Header 的 Content-Disposition
  6. 关于ZendOptimizer和wamp的phpmyadmin冲突问题
  7. Listview 的顶部动态广告位的实现
  8. a href=#与 a href=javascript:void(0) 的区别 打开新窗口链接的几种办法
  9. 必须掌握的八个【cmd 命令行】[
  10. 定义结构体的时候,里面的变量可以同时初始化吗?(不可以)