设计模式:单例模式之懒汉式
懒汉式(线程不安全)
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;}
}
设计模式:单例模式之懒汉式相关推荐
- 设计模式 - 单例模式(Singleton Pattern)
单例模式 介绍 模式:创建型 意图:保证一个类只有一个实例,并提供一个访问它的全局访问点 解决:一个全局使用的类频繁地创建与销毁 场景: 唯一序列号 web中的计数器 I/O与数据库的连接 -- 实现 ...
- java singleton inner class_Java面向对象设计模式-单例模式
Java面向对象设计模式-单例模式 2020-05-28 589 0 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点,有多重实现方式. 一.饿汉式单例模式,构造方法私有化,在加载类Sin ...
- 炒冷饭系列:设计模式 单例模式
2019独角兽企业重金招聘Python工程师标准>>> 炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆 ...
- 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例
场景 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例: 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例_霸道流氓气质的博客- ...
- 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)
创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...
- 设计模式 -- 单例模式(Singleton)
写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初始单例 ...
- 小视频源码,设计模式单例模式
小视频源码,设计模式单例模式实现的相关代码 .一,单线程时候推荐 /*** Created by Shinelon on 2018/10/11.* 单利模式 懒汉式 -->单线程推荐使用*/pu ...
- Java 设计模式 - 单例模式
Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录 Java 设计模式 - 单例模式 单例设计模式介绍 单例设计模式八种方式 饿汉式 - 静态常量 饿汉式( ...
- C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)
C++设计模式--单例模式详解(懒汉模式.饿汉模式.双重锁) 应用场景 一.单例模式是什么? 二.使用步骤 1.UML图 2.代码实现 应用场景 通常我们在做通讯的时候,我们跟服务器数据交互,假如每次 ...
最新文章
- python刷题一亩三分地_手把手教你用python抓网页数据【一亩三分地论坛数据科学版】...
- pyinstaller python3.7_解决python3.7安装好pyinstaller却不能使用的问题
- 杀毒软件:看企业版与单机版之间区别
- 设计模式-单件模式(Singleton pattern)
- 分页携带请求参数_一个值得深思的小问题 请求中的参数值为空要不要携带该参数?...
- python 数据离散化和面元划分
- Hadoop框架:集群模式下分布式环境搭建
- 10用户账户控制只有否_【新书连载】测试工程师核心开发技术(10)—数据库体系结构...
- 创业需要的学习能力不是读书考试做题也不是所谓的思维格局
- ORACLE报错(5)ORA-01102: cannot mount database in EXCLUSIVE mode
- java并行调度_java并行调度框架封装及示例
- DragVideo,一种在播放视频时,可以任意拖拽的方案
- Myeclipse8.5 最新注册码以使用方法(可以用到2015年!!!)
- LVM报错:resize2fs: Bad magic number in super-block
- JavaScript参考文档
- android手机 hdmi,手机的高清输出——MHL和micro HDMI测试
- CString彻底分析,很强悍的啊
- 装系统后恢复U盘容量
- 《第六周RFID作业》物联112118 林家辉
- SOA RPC SOAP REST
热门文章
- FastJson乱序问题
- 大数据笔记(六)——HDFS的底层原理:JAVA动态代理和RPC
- sqoop导入数据到hive中元数据问题
- 使对象具有ES6中Iterator接口的实现方法
- 【转】HTTP Response Header 的 Content-Disposition
- 关于ZendOptimizer和wamp的phpmyadmin冲突问题
- Listview 的顶部动态广告位的实现
- a href=#与 a href=javascript:void(0) 的区别 打开新窗口链接的几种办法
- 必须掌握的八个【cmd 命令行】[
- 定义结构体的时候,里面的变量可以同时初始化吗?(不可以)