1.饿汉式:
public class Singleton{
// 在自己内部定义一个自己的实例
// 注意,这个是private 只供内部调用
private static Singleton instance = new Singleton();
//将构造函数设为私有
private Singleton(){
}
// 静态工厂方法,提供一个供外部使用得到对象的静态方法
public static Singleton getInstance(){
return instance;
}
}
2. 懒汉式:
public class Singleton{
private static Singleton instance = null;
private Singleton(){
}
public static synchronized Singleton getInstance (){
if(instance==null)
instance = new Singleton();
return instance;
}
}
使用 Java 语法的双重检验锁定 Singleton 代码
// C++ port to Java class Singleton { public static Singleton Instance() { if (_instance == null) { synchronized (Class.forName("Singleton")) { if (_instance == null) { _instance = new Singleton(); } } } return _instance; } protected Singleton() { } private static Singleton _instance = null; } |
在使用 Java 语法的双重检验锁定 Singleton 代码示例中,我们直接将 C++ 代码移植到 Java 代码,以便利用 Java 关键部分块(已同步)。 主要差别是不再有单独的声明和实现部分,没有指针数据类型,并且采用了新的双重检验机制。 双重检验发生在第一个 IF 块上。 如果成员变量为空,则执行进入关键部分块,该块再次双重检验该成员变量。 仅在通过此最终测试后,才会实例化该成员变量。 一般来说,两个线程无法使用这种方法创建两个类实例。 另外,因为在第一次检查时没有出现线程阻塞,所以对此方法的大多数调用不会由于必须进入锁定而导致性能下降。 目前,在实现 Singleton 模式时,很多 Java 应用程序中都广泛使用这种方法。 这种方法很巧妙,但也有瑕疵。 某些优化编译器可以将惰性初始化代码优化掉或对其重新进行排序,并且会重新产生线程安全问题。 有关更深入的解释,请参阅 "The Double-Check Locking is Broken" Declaration。
另一种试图解决此问题的方法可能是,在成员变量声明中使用 volatile 关键字。 这应该告诉编译器不要对代码重新排序,并且放弃优化。 目前,这是唯一建议的 JVM 内存模型,并且不会立即解决该问题。
实现 Singleton 的最好方法是什么? 最终(而不是碰巧),Microsoft .NET 框架解决了所有这些问题,从而更易于实现 Singleton,却不会产生我们目前讨论的不利副作用。 .NET 框架以及 C# 语言允许我们在必要时通过替换语言关键字,将上述的 Java 语法移植到 C# 语法。 因此,Singleton 代码变为以下内容:
以 C# 编码的双重检验锁定
// Port to C# class Singleton { public static Singleton Instance() { if (_instance == null) { lock (typeof(Singleton)) { if (_instance == null) { _instance = new Singleton(); } } } return _instance; } protected Singleton() { } private static volatile Singleton _instance = null; } |
分享到:
相关推荐
单态模式是在面向对象设计中实现类似单例行为的一种替代方法,确保Java应用程序中的共享状态。它强制实现一种独特的行为,即类的所有实例共享相同的状态。与单例模式不同,单例模式将类限制为单个实例,单态模式允许...
### Java中单态设计模式详解 #### 一、引言 设计模式是在长期软件开发过程中提炼出来的最佳实践,它们提供了一种标准化的方式用于解决特定类型的问题。对于Java开发者而言,熟悉并掌握各种设计模式是非常重要的,...
在Java、C#等面向对象编程语言中,单态模式的实现通常分为几种方式: 1. 饿汉式(Eager Initialization):在类加载时就完成实例化,这种方式保证了单例的唯一性,同时也确保了线程安全。但是可能会造成内存浪费,...
1. **单态模式实现**: - 在Java中,我们通常通过私有构造函数和一个静态方法来创建并返回单例对象。以下是一个简单的单例模式实现: ```java public class SingletonLogin { private static SingletonLogin ...
在提供的代码示例中,展示的是饿汉式的单态模式实现。具体如下: ```java package org.singleton; // 单态设计模式 class Singleton3 { // 私有构造函数防止外部直接实例化 private Singleton3() {} // 静态...
单态模式(Singleton Pattern)和简单工厂模式(Simple Factory Pattern)是软件设计中常见的两种创建型设计模式。在Java编程中,它们都是为了简化对象的创建过程,但各自有着不同的应用场景和特点。 单态模式是一...
Java设计模式是软件开发中的重要概念,它们是解决常见...这个压缩包资料“[浪曦原创]JAVA设计模式 第2讲 单态模式和简单工厂模式(jzkangta)”应包含了详细的讲解和示例代码,可以帮助深入理解和应用这两种设计模式。
单态模式的实现通常包含以下几个关键点: 1. **私有化构造函数**:防止其他类直接通过`new`关键字创建对象。 2. **静态内部类或者枚举**:在Java中,常使用静态内部类或枚举来保证线程安全的同时延迟初始化。 3. **...
在Java中,实现单态模式主要有两种方式: 1. **饿汉式(Eager Initialization)**: ```java public class Singleton { private Singleton() {} // 构造函数私有化 private static Singleton instance = new ...
在Java或其他面向对象语言中,单态模式的实现有多种方式,但核心思想都是限制类的实例化过程。 一、单态模式的基本结构 单态模式通常包含以下关键部分: 1. 单例类:这个类只能被实例化一次,它负责创建自己的唯一...
在Java中,自Java 5起,可以使用`Enum`来实现单态模式,这是线程安全且具有良好性能的方式: ```java public enum Singleton { INSTANCE; public void whateverMethod() { // ... } } ``` 单态模式的优点包括...
以下是两种常见的单态模式实现方式: 1. 饿汉式(Eager Initialization): 这种方式在类加载时就完成了初始化,所以类加载比较慢,但获取实例的速度快,且线程安全。如: ```java public class Singleton { ...
总结一下,本篇笔记涵盖了Java编程中的重要概念,包括构造器链、多态性、单态模式、静态初始化和对象引用比较,以及参数传递机制。理解并熟练运用这些知识点,能帮助开发者写出更加高效、可靠的Java代码。
单态模式 http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html 结构型 适配器模式 http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html 桥接模式 ...
在Java编程中,单态模式被广泛应用于那些需要频繁实例化然后销毁的对象,或者创建对象需要消耗大量资源的情况,以及希望在系统中只有一个控制中心来协调操作的场景。 在MyEclipse这样的集成开发环境中,开发者经常...
单态模式确保一个类只有一个实例,并提供一个全局访问点。这在资源管理、配置管理等场景下特别有用,其中只应存在一个实例以确保数据的一致性和完整性。 **1.1.5 原型模式(Prototype)** 原型模式通过复制一个已...
在JAVA设计模式中,创造型模式包括工厂方法、抽象工厂、创造者模式、单态模式、原型模式等五类。 一、工厂方法模式 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的...
在 Java 中,设计模式的应用非常广泛,例如在 Spring 框架中的 IOC 容器就是使用了工厂方法模式和单态模式。在 Java EE 中,也有很多设计模式的应用,例如在 Hibernate 中使用了代理模式和装饰模式。 设计模式是一...
单态模式是一种创建型设计模式,它提供了一种创建对象的接口,确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。 5. 原型模式(Prototype Pattern) 原型模式是一种创建型设计模式,它提供了一种创建...