对Java单例设计模式中懒汉式类定义的讨论
全世界人民都知道单例设计模式中类的定义分为懒汉式和饿汉式两种,然而今天并不是要把它们做横向比较。实际上,不论饿汉式类的代码看起来有多么美轮美奂,在实际开发中它的效率总是不如懒汉式的。然而在笔试和面试中懒汉式的出镜率可以说是比饿汉式不知道高到哪里去了,因此把它完全弄懂应该是十分有必要的。
饿汉式:
class Single1
{
int num = 1;
private static Single1 single1 = new Single1();
private Single1(){}
static Single1 getInstance1()
{
return single1;
}
}
最简单的懒汉式:
class Single2
{
int num = 2;
private static Single2 single2 = null;
private Single2(){}
static Single2 getInstance2()
{
//如果两个线程同时访问,有可能会生成两个实例,不符合单例模式的要求
if(single2 == null)
single2 = new Single2();
return single2;
}
}
然而这样的类定义实际上是线程不安全的。正如注释上说的,因为线程的不确定性无法确认它们在访问Single2 = new Single2();时是否已经有一个Single2的实例生成。在面试中如果写出这样一个代码,往往会被追问如果改进能让它线程安全。根据一般思路,我们对代码做出如下改进:
class Single2
{
int num = 2;
private static Single2 single2 = null;
private Single2(){}
static Object obj = new Object(); //创建同步锁对象
static Single2 getInstance2()
{ synchronized(obj) //同步锁,确保某一时刻只有一个线程能够访问内部模块
{
if(single2 == null)
single2 = new Single2();
return single2;
}
}
}
代码经过以上的改进可以解决线程不安全问题,然而此时可能又会被问到:这样虽然能解决线程不安全问题,但是同时却降低了程序的效率,如何改进代码?其实在外层再添加一个条件判断语句就可以了。
class Single2
{
int num = 2;
private static Single2 single2 = null;
private Single2(){}
static Object obj = new Object();
static Single2 getInstance2()
{
if(single2 == null)
{
synchronized(obj)
{
if(single2 == null)
single2 = new Single2();
}
}
return single2;
}
}
完美了,估计没有什么好问的了,测试一下。
public class Single
{
public static void main(String[] args)
{
Single1 s1 = Single1.getInstance1();
Single2 s2 = Single2.getInstance2();
System.out.println(s1.num+".."+s2.num);
}
}
输出结果:
1..2
没毛病!
对Java单例设计模式中懒汉式类定义的讨论的更多相关文章
- java设计模式--解决单例设计模式中懒汉式线程安全问题
首先写个单例,懒汉模式: public class SingleDemo { private static SingleDemo s = null; private SingleDemo(){} pu ...
- java软件设计模式——单例设计模式中的【饿汉式】与 【懒汉式】示例
以下为单例设计模式中的两种经典模式的代码示意: 单例设计模式(spring框架IOC,默认创建的对象都是单例的): 饿汉式: public class SingleClass { private Si ...
- Java单例设计模式的实现
1. 单例设计模式的定义 单例设计模式确保类只有一个实例对象,类本身负责创建自己的对象并向整个系统提供这个实例.在访问这个对象的时候,访问者可以直接获取到这个唯一对象而不必由访问者进行实例化. 单例设 ...
- 转:java单例设计模式
本文转自:http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html 单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton ...
- 菜鸡的Java笔记 第二十九 - java 单例设计模式
SingleCase 单例设计模式 1.单例设计模式的特点 2.多例设计模式的特点 内容 单例设计模式 现在如果说有这么一个程序类 class S ...
- Java中常用来处理时间的三个类:Date、Calendar、SimpleDateFormate,以及Java中的单例设计模式:懒汉式、饿汉式以及静态内部类式
(一)java.util.Date类 1.该类有一个long类型的属性:用来存放时间,是用毫秒数的形式表示,开始的日期是从1970年1月1号 00:00:00. 2.该类的很多方法都已经过时,不 ...
- Java 单例设计模式之 饿汉式和懒汉式
public class InstanceSampleTest { public static void main(String[] args) { /** 单例设计模式的 饿汉式和懒汉式 * 单例模 ...
- Java单例设计模式(实现Java的一个类只有一个对象)
单例设计模式的定义:单例设计模式是一种软件设计模式,在它的核心包含一个称为单例类的核心类. 核心便是希望一个类只有一个对象. 如何实现类在内存中只有一个对象呢? 第一步:构造私有:第二步:本身提供一 ...
- Java——单例设计模式
设计模式:解决某一类问题最行之有效的方法.Java中23种设计模式:单例设计模式:解决一个类在内存中只存在一个对象. 想要保证对象唯一.1,为了避免其他程序过多建立该类对象.先禁止其他程序建立该类对象 ...
随机推荐
- 使用ScheduledThreadPoolExecutor执行定时任务
ScheduledThreadPoolExecutor scheduled = new ScheduledThreadPoolExecutor(2); scheduled.scheduleAtFixe ...
- Centos7】hostnamectl 设置主机名
Centos7中提供了设置主机名的工具 hostnamectl hostname有三种状态 static(永久) transient(瞬态) pretty (灵活) 查看主机名状态 [oracle@h ...
- RocketMQ入门(生产者)_2
从 RocketMQ环境搭建_1 我们已经建立了MQ的Server,接下来就是简单的生产和消费的过程. 1. rocketMQ的源码中有个示例代码example ,我们从Apache官网中可以下载源 ...
- Windows 2008 R2 域控制器防止意外删除现有OU的设置
Windows 2008 R2 域控制器防止意外删除现有OU(组织单元)的设置:1.以管理员身份运行Active Directory的Windows PowerShell模块: 2.键入以下命令来检查 ...
- Win10系统下,本地连接远程桌面(Win2016)图解
1.Win+R在运行框中输入mstsc,回车 2.在出现的远程登陆窗口中,计算机中输入远程桌面IP 3.点击显示选项按钮,在远程桌面窗口中,点击常规(默认),输入登陆的用户名: XXXXXX 4.点击 ...
- 通过微信公众号API复制公众号自定义菜单同时增加子菜单方法
主要的原因是再不破坏公众号以前的菜单的基础上增加自定义菜单,主要步骤如下: 1.通过微信提供的微信公众平台接口调试工具获取公众号的所有自定义菜单 网址:https://mp.weixin.qq.com ...
- List接口特有功能
List 有序的 有整数索引 允许重复使用 特有功能: void add(int index, E element) //指定位置添加元素 E get()int index) ...
- c3p0数据源的第一次尝试
开始补习 以前学习过的基础 正在尝试从c3p0 获取到connection 好的,首先上代码吧 public static DataSource ds = null; static { ComboPo ...
- QUARTZ系列之二-监听器
Listener 1.是什么: perform actions based on events occurring within the scheduler. 2.分类:a.TriggerListen ...
- java 查询路径中所有文件夹和文件的名称,支持文件名模糊查询
java 查询路径中所有文件夹和文件的名称,支持文件名模糊查询 有时候我们遇到需要查询服务器或者本机某个路径下有哪些文件?或者根据文件名称模糊搜索文件,那么就可以使用本方法:可以获取某个路径下所有文件 ...