单例模式----设计模式系列

简介:

这次主要写了四种类型的单例模式

  • 饿汉式
  • 懒汉式
  • 同步方法锁
  • 双重锁定
自己留着以后忘记时查看用的,所以注释比代码都多。项目结构很简单,一个Singleton类,一个测试类。直接上代码了。
package com.dyk.singleton;

public class Singleton {

	private static Singleton mSingleton;

	/**
	 * <b>饿汉式单例</b>
	 * <p>
	 * 静态初始化的方式是在自己被加载时就将自己实例化,所以被形象地称为饿汉式单例类
	 */
	private static Singleton mSingleton2 = new Singleton();

	/** <b>饿汉式单例</b> */
	public static Singleton getInstance5() {
		return mSingleton2;
	}

	/** 私有化构造方法,防止从外界直接创建对象。 */
	private Singleton() {

	}

	/**
	 * <b>懒汉式单例。</b>在多线程模型下可能产生多个实例。 例如:当两个线程同时运行到new Singleton()那一行,则会产生两个对象。
	 * @return instanceof Singleton
	 */
	public static Singleton getInstance() {
		if (mSingleton == null) {
			mSingleton = new Singleton();
		}
		return mSingleton;
	}

	/**
	 * 运用同步锁机制,锁住获取实例的方法。 优点:可以保证一个类中只有一个实例。
	 * 缺点:在多线程环境下,第一个线程进入getInstance2()方法后,其余线程都必须等待,直到第一个线程释放资源
	 * 假设有100个线程,那么第一百个线程需要等待前99个线程全部释放资源后才能进入getInstance2()方法
	 * 
	 * @return instanceof Singleton
	 */
	public static synchronized Singleton getInstance2() {
		if (mSingleton == null) {
			mSingleton = new Singleton();
		}
		return mSingleton;
	}

	/**
	 * 和getInstance2()很类似。
	 * 区别是getInstance2()锁住的是方法,在线程访问getInstance2()的同时,其他线程可以访问Singleton类的其他方法。
	 * 而getInstance3()锁住的是整个类,独占了整个类的访问。
	 * @return instanceof Singleton
	 */
	public static Singleton getInstance3() {
		synchronized (Singleton.class) {
			if (mSingleton == null) {
				mSingleton = new Singleton();
			}
		}
		return mSingleton;
	}

	/**
	 * <b>双重锁定(Double-Check-Locking)</b><br/>
	 * 在synchronized关键字内还要再进行一次判空是因为:<br/>
	 * 如果同时有两个线程调用GetInstace4()方法时,<br/>
	 * 它们都将可以通过第一重mSingleton==null的判断。<br/>
	 * 然后由于synchronized机制,这两个线程只有一个可以进入。然后由第一个进入的线程创建相应的实例。<br/>
	 * 如果没有第二重判断,则会创建出两个实例,这明显与单例精神不符。
	 * @return instanceof Singleton
	 */
	public static Singleton getInstance4() {
		if (mSingleton == null) {
			synchronized (Singleton.class) {
				if (mSingleton == null) {
					mSingleton = new Singleton();
				}
			}
		}
		return mSingleton;
	}

}

package com.dyk.singleton;

public class SingletonTest {

	public static void main(String[] args) {

		// hungerManTest();
		// lazyManTest();
		// synchronizedTest();
		// doubleCheckLockingTest();

	}

	private static void doubleCheckLockingTest() {
		for (int i = 0; i < 1000; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					Singleton mSingleton = Singleton.getInstance4();
					System.out.println("Thread name="
							+ Thread.currentThread().getName() + "实例内存地址="
							+ mSingleton.toString());
				}
			}).start();
		}
	}

	private static void synchronizedTest() {
		for (int i = 0; i < 1000; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					Singleton mSingleton = Singleton.getInstance2();
					System.out.println("Thread name="
							+ Thread.currentThread().getName() + "实例内存地址="
							+ mSingleton.toString());
				}
			}).start();
		}
	}

	/** 懒汉式单例测试 */
	private static void lazyManTest() {
		for (int i = 0; i < 10; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					// 一次测试不一定成功,需要多运行几次
					Singleton mSingleton = Singleton.getInstance();
					System.out.println("Thread name="
							+ Thread.currentThread().getName() + "实例内存地址="
							+ mSingleton.toString());
				}
			}).start();
		}
	}

	/** 饿汉式单例测试 */
	private static void hungerManTest() {
		for (int i = 0; i < 1000; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					Singleton mSingleton = Singleton.getInstance5();
					System.out.println("Thread name="
							+ Thread.currentThread().getName() + "实例内存地址="
							+ mSingleton.toString());
				}
			}).start();
		}
	}

}

相关文章
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
27 2
|
12天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
20天前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
15 1
|
1月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和复用性的关键技术之一。本文将通过探讨单例模式,一种最常用的设计模式,来揭示其在PHP中的应用及优势。单例模式确保一个类仅有一个实例,并提供一个全局访问点。通过实际案例,我们将展示如何在PHP项目中有效实现单例模式,以及如何利用这一模式优化资源配置和管理。无论是PHP初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和技巧,进而提升自己的编程实践。
|
1月前
|
设计模式 安全 Java
C# 一分钟浅谈:设计模式之单例模式
【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy&lt;T&gt;` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
29 1
|
1月前
|
设计模式 缓存 数据库连接
探索PHP中的设计模式:单例模式的实现与应用
在PHP开发中,设计模式是提高代码可复用性、可维护性和扩展性的重要工具。本文将深入探讨单例模式(Singleton Pattern)的基本概念、在PHP中的实现方式以及实际应用场景。单例模式确保一个类仅有一个实例,并提供全局访问点。通过具体代码示例和详细解释,我们将展示如何在PHP项目中有效利用单例模式来解决实际问题,提升开发效率和应用性能。
|
1月前
|
设计模式 存储 测试技术
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发领域,设计模式是解决常见问题的最佳实践。本文将深入探讨单例模式,一种确保类只有一个实例的设计模式,并提供实际应用示例。我们将从单例模式的基本概念讲起,通过实际案例展示如何在PHP中实现单例模式,以及它在不同场景下的应用和优势。最后,我们会探讨单例模式的优缺点,帮助开发者在实际项目中做出明智的选择。
|
1月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
1月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入探讨与实践
在PHP开发领域,设计模式是提升代码可读性、可维护性和扩展性的重要工具。本文聚焦于单例模式——一种确保类只有一个实例,并提供全局访问点的设计模式。我们将从定义、实现方式、应用场景以及在PHP框架中的运用等方面进行详细探讨,旨在帮助PHP开发者更好地理解和运用单例模式。
|
26天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
25 0