`
whp0731
  • 浏览: 174857 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

几种单例方式的比较

阅读更多

注意:对于方法一、方法二,都要写一个私有的构造方法,因为如果省略这一步的话,外界就可以通过new,调用它的默认的公有不带参数构造方法了。

 

 区别如下

1、对于方法一:

(1)不使用的时候不生成单例

 

(2)多线程的情况下,有可能出现并不是单例的情况。

package com.test2;

public class Singleton
{
	private static Singleton singleton;
	
	private Singleton()
	{
		
	}
	
	public static Singleton getInstance()
	{
		if(null == singleton)
		{
			/*   try
			{
				Thread.sleep(2000);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}   */
			
			singleton = new Singleton();
		}
		
		System.out.println(singleton);
		
		return singleton;
	}
}

 

针对于方法1的测试类(测试时恢复上面单例模式的注解部分)

package com.test2;

public class SingletonTest
{
	
	public static void main(String[] args)
	{
		for(int i = 0 ; i < 10 ; ++i)
		{
			MyThread myThread = new MyThread();
			
			myThread.start();
		}
	}

}


class MyThread extends Thread
{
	@Override
	public void run()
	{
		Singleton.getInstance();
	}
}

 

 

 

 

 

2、方法二(推荐)

(1)类加载时就生成单例。

 

(2)多线程时也始终是单例模式。

package com.test2;

public class Singleton2
{
	private static Singleton2 singleton = new Singleton2();

	private Singleton2()
	{

	}

	public static Singleton2 getInstance()
	{
		/*  try
		{
			Thread.sleep(2000);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
		
		System.out.println(singleton);  */

		return singleton;
	}
}

  

 针对于方法2的测试类(测试时恢复上面单例模式的注解部分)

package com.test2;

public class Singleton2Test
{

	public static void main(String[] args)
	{
		for(int i = 0 ; i < 10 ; ++i)
		{
			MyThread2 myThread2 = new MyThread2();
			
			myThread2.start();
		}
	}

}


class MyThread2 extends Thread
{
	@Override
	public void run()
	{
		Singleton2.getInstance();
	}
}

 

分享到:
评论

相关推荐

    几种单例模式demo

    单例模式的实现方式有很多种,下面我们将详细探讨几种常见的单例模式的实现方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private ...

    几种单例模式说明(并有实例)

    根据给定的信息,本文将详细解释几种常见的单例模式,并通过具体的Java代码示例来阐述每种模式的特点和实现方式。 ### 单例模式简介 单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局...

    unity中涉及的三种单例模式

    下面将详细介绍在Unity中涉及的三种单例模式:C#经典单例、Unity内置单例以及一种线程安全的改进版单例。 1. C#经典单例: 这是最常见的单例实现方式,通常通过私有构造函数和一个静态方法来保证只有一个实例。在...

    几种单例模式

    接下来,我们将深入探讨几种常见的单例模式实现方式。 ### 1. 饿汉式(静态常量) ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} ...

    JAVA单例模式的几种实现方法

    ### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...

    7种单例模式

    在多线程环境下,我们需要确保单例实例的创建只发生一次,以上几种方式除了懒汉式(线程不安全)外,都能保证线程安全。对于反序列化测试,由于默认反序列化会生成新实例,需要重写 `readResolve()` 方法来防止这种...

    单例模式的几种实现方式

    下面将详细介绍单例模式的几种常见实现方式。 1. 饿汉式(静态常量) 饿汉式单例在类加载时就完成了初始化,因此线程安全。这种方式简单且效率高,但如果单例对象不被使用,会造成内存浪费。 ```java public class...

    单例模式的几种实现方式demo

    下面我们将深入探讨单例模式的几种实现方式。 ### 1. 饿汉式(静态常量) 饿汉式单例在类加载时就完成了初始化,因此是线程安全的。代码如下: ```java public class Singleton { private static final ...

    单例模式代码实现

    这个讲的是单例模式的多种不同实现方式,希望对单例感兴趣的同学看看

    单例模式各种实现方式

    以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private static final Singleton...

    Java设计模式之单例模式的七种写法

    在 Java 中,单例模式的写法有好几种,主要有懒汉式单例、饿汉式单例、登记式单例等。 懒汉式单例是一种常见的单例模式实现方式,它在第一次调用的时候实例化自己。下面是懒汉式单例的四种写法: 1、基本懒汉式...

    java-单例模式几种写法

    以下是对这六种常见单例模式实现方式的详细解释: 1. **饿汉式(静态常量)** 这是最简单的单例实现,它在类加载时就创建了实例,线程安全。 ```java public class Singleton { private static final Singleton...

    C++ 单例模式的几种实现方式研究

    "C++ 单例模式的几种实现方式研究" 单例模式是设计模式中最常应用的一种模式,也是面试官最喜欢的题目。但是,如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况。 单例模式的主要...

    Python中的单例模式的几种实现方式的及优化

    本篇文章将深入探讨Python中实现单例模式的几种方式以及它们的优缺点和优化策略。 首先,Python的模块机制实际上天然地支持单例模式。当模块首次被导入时,解释器会执行模块中的所有代码,生成相应的`.pyc`文件。...

    IOS 页面之间几种传值方式(单例,代理,kvc)

    本教程将详细介绍三种主要的传值方式:单例(Singleton)、代理(Delegate)以及Key-Value Coding(KVC)。理解并熟练掌握这些方法,能有效提升应用的交互性和代码的可维护性。 **1. 单例(Singleton)** 单例模式...

    OC单例模式讲解

    为了解决这个问题,可以采用以下几种方法: 1. **双重检查锁定(Double-checked locking)**:这是一种常用的解决线程安全问题的方法,可以在不牺牲性能的情况下保证单例模式的线程安全。 2. **使用`@synchronized`...

    iOS 页面间几种传值方式(属性,代理,block,单例,通知) - iOS知识库1

    iOS 页面间几种传值方式 iOS 页面间传值是 iOS 开发中一个常见的需求,通常情况下,我们可以使用属性、代理、block、单例、通知等多种方式来实现页面间的传值。 属性传值 属性传值是最常见的一种传值方式。在 iOS...

    singleton.zip单例的几种实现demo,

    在"singleton.zip"压缩包中,我们可能会找到几种不同的Java单例实现方式的示例代码,包括饿汉式、懒汉式、反射实现以及内部类实现等。以下是对这些单例模式实现方式的详细解释: 1. **饿汉式(Eager Initialization...

    Android单例模式

    为解决这一问题,有以下几种方案: 1. **在`getInstance`方法上加同步关键字**:简单但效率较低。 ```java public static synchronized Singleton getInstance() { if (single == null) { single = new ...

Global site tag (gtag.js) - Google Analytics