最近在学习设计模式,在看到单例时突然想到如果在多线程的情况下会导致出错(多个线程同时进行操作)。因此赶紧放狗去搜。终于找到了一段据说可以实现线程安全的单例程序。我把它贴出来,希望有人能解答我的疑惑。
Java代码
package net.chopsuey.singleton;
public class Singleton
{
private static class SingletonHolder
{
static Singleton instance = new Singleton();
}
public static Singleton getInstance()
{
return SingletonHolder.instance;
}
}
我如何才能知道这段代码就是线程安全的呢?有谁能帮忙写个测试代码给我测试一下吗?最好是有屏幕输出语句的。
问题补充:
首先非常感谢各位的关注。但我已经弄明白了。把我的意见贴出来大家交流一下。
单例设计模式有两种形式:一种是饥饿式
Java代码
package net.chopsuey.singleton;
public final class EagerSingleton
{
private static EagerSingleton singObj = new EagerSingleton();
private EagerSingleton()
{
}
public static EagerSingleton getSingleInstance()
{
return singObj;
}
}
比较明显,这种是线程安全的。因为static变量是在类被加载时(有可能没被实例化)初始化并仅被初始化一次。因为这样就可以保证只有一个singObj被初始化。
另外一种则是懒汉式
Java代码
package net.chopsuey.singleton;
public final class LazySingleton
{
private static LazySingleton singObj = null;
private LazySingleton()
{
}
public static LazySingleton getSingleInstance()
{
if (singObj == null)
{
singObj = new LazySingleton();
}
return singObj;
}
这种则是线程不安全的了。因为当有多个线程一起调用getSingleInstance()时则可能会生成多个实例。因此才需要修改一下。修改为我之前的那段代码
Java代码
package net.chopsuey.singleton;
public class Singleton
{
private static class SingletonHolder
{
static Singleton instance = new Singleton();
}
public static Singleton getInstance()
{
return SingletonHolder.instance;
}
}
一个静态内部类内的一个静态成员就可以保证它只在类被加载时只初始化一次。因此不管有多少个线程来调用它,都只能得到同个实例(类被加载时初始化的那个)。
如果有什么不同意见的话,欢迎各位继续提出!
分享到:
相关推荐
在Java多线程编程中,同步机制是保证数据一致性、避免资源竞争的关键。在这个名为“panda-demo.zip”的项目中,作者深入探讨了两种主要的同步工具:ReadWriteLock(读写锁)和Synchronized,通过实际的代码实现来...
最新版熊猫看书KJava,功能强大,而且免费,不下白不下,下老也白下!
【压缩包子文件的文件名称列表】中的"PandaReader_J2ME.jad"和"PandaReader_J2ME.jar"是Java ME应用程序的标准部署文件。jad文件是Java应用描述文件,包含了应用的基本信息,如版本号、作者、屏幕大小等,以及jar...
"panda"项目作为一个熊猫测试程序,它包含了对Java 8核心特性的实际应用,如函数式编程、流API(Stream API)和日期时间API等。下面我们将详细探讨这些知识点。 1. **函数式编程**:Java 8引入了Lambda表达式,使得...
Java远程控制技术是一种在不同设备之间进行操作和通信的方法,主要应用于系统管理、软件调试、协同工作等场景。本文将详细探讨如何利用Java实现图像化界面交互、文件传输以及DOS命令控制,以提高远程操作的效率和...
《PandaTvDanMu——熊猫TV弹幕助手的JAVA实现详解》 在互联网直播领域,弹幕作为一种互动方式,已经成为用户参与度的重要标志。PandaTvDanMu项目,即熊猫TV弹幕助手,是一个基于JAVA语言开发的开源工具,旨在为用户...
在Java编程语言中,处理PNG图像的透明度是一项常见的任务,尤其在创建用户界面或进行图形设计时。PNG格式支持alpha通道,这使得它能够表示不同程度的透明度,即所谓的“半透明”。以下是一些关于如何在Java中处理PNG...
具有python客户端和java服务器与panda3d游戏引擎协作的经验。 担任服务器部分的团队负责人,并为整个服务器程序的实施做出了贡献。 实现了心跳功能,用于更新所有在线玩家与其他玩家和环境的动作,这对我们来说是最...
《91PandaReader for J2ME V1.37_local.zip》是一个针对Java ME(J2ME)平台的电子书阅读应用的压缩包。这个软件版本为1.37,专为移动设备设计,尤其是那些支持Java应用程序的非智能手机。"91PandaReader"是该应用的...
【标题】:“打字小游戏”是基于Java Swing开发的一款互动软件,旨在提高用户打字速度和准确性。通过游戏化的方式,使得学习打字变得更加有趣,同时也增强了用户对键盘布局的熟悉程度。 【描述】:这款打字小游戏...
在Java中实现SHA-256加密算法,可以使用内置的`java.security.MessageDigest`类。这个过程涉及到几个关键步骤,包括创建`MessageDigest`实例、更新输入数据和获取哈希值。 首先,我们需要导入必要的Java库: ```...
Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...
【基于Java+MySQL的ATM管理系统】是一种使用Java编程语言和MySQL数据库技术开发的应用程序,主要目的是模拟实际的自动取款机(ATM)功能,为用户提供存款、取款、查询余额等服务。这个项目是初学者在学习完Java基础...
### Java继承概述 在Java编程语言中,**继承**是一种重要的面向对象编程特性,它允许创建新类(称为子类或派生类)来继承现有类(称为父类、基类或超类)的属性和行为。通过继承,子类不仅能够重用父类的方法和字段...
Java线程.pdf
Jenkins的ShiningPanda插件 版权所有:copyright:2011-2015,ShiningPanda SAS 关于 这个插件是由ShiningPanda SAS,主编开发 ,Web服务来监控你的Python项目的依赖关系。 以获取更多信息! 特征 该插件通过一些有用...
### Java虚拟机规范(Java SE 7)关键知识点解析 #### 一、概述 《Java虚拟机规范(Java SE 7)》是一本详细介绍Java虚拟机(JVM)工作原理的标准文档,由Tim Lindholm、Frank Yellin、Gilad Bracha、Alex Buckley等...
3. **Panda3D**:虽然不是专为Java设计,但通过Java绑定支持Java开发,提供丰富的图形渲染功能。 #### 六、音效与音乐 1. **Java Sound API**:提供了基本的声音处理功能,如播放音频文件。 2. **OpenAL**:一个跨...
2. **子类(如Lion、Tiger、Panda等)**:每个子类继承自Animal类,并添加各自特有的属性和行为。 3. **Zoo类**:负责管理动物园的总体运行,包括添加动物、安排展示、处理游客等操作。 4. **Visitor类**:表示游客...