`

Java单例在多线程环境中的实现

阅读更多
参考网址如下:
http://xupo.iteye.com/blog/463426
http://www.iteye.com/topic/1121678?page=3


package com.lj.singleton2;

public class Singleton
{
	private static Singleton st;

	private static Singleton instance1 = new Singleton();

	private static Singleton instance2;

	private static Singleton instance3;

	private Singleton()
	{
	}

	// 懒汉式单例->当需要的时候,并且发现没有实例的时候,采取初始化
	public static Singleton getInstance()
	{
		if (null == st)
		{
			threadSleep();
			synchronized (Singleton.class)
			{  
				//这里线程们会一个个执行st=new Singleton();然后返回,
				//所以这个方法在多线程环境中没用。
				st = new Singleton();
			}
		}
		return st;
	}

	// 饿汉式单例->不管你需不需要,反正我是饿了,类加载的时候就已经
	//  初始化,没有起到延迟加载的效果。
	// 优点:这种方式最简单并且是线程安全的。
	// 缺点:假如这个单例非常大, 在第一次类加载的时候可能会耗掉大量资源。
	public static Singleton getInstance1()
	{
		return instance1;
	}

	
	// 对懒汉式进行同步,牺牲了性能,同步的原则应该是尽量对代码块同步,
	// 不要对整个方法同步
	public static synchronized Singleton getInstance2()
	{
		if (instance2 == null)
		{
			threadSleep();
			instance2 = new Singleton();
		}
		return instance2;
	}

	// 双重检查加锁DCL(double checking lock),只在第一次调用
	// getInstance()时才要同步,提高性能
	public static Singleton getInstance3()
	{
		if (instance3 == null)
		{
			threadSleep();
			synchronized (Singleton.class)
			{
				if (instance3 == null)
				{
					instance3 = new Singleton();
				}
			}

		}
		return instance3;
	}

	// 让当前线程休眠1秒,模拟多个线程同时访问instance
	public static void threadSleep()
	{
		try
		{
			System.out.println("当前线程休眠1秒");
			Thread.currentThread().sleep(1000);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

}


上面是实现单例的各种方法。


public class ThreadTest extends Thread
{
	@Override
	public void run()
	{
		Singleton s=Singleton.getInstance();
		System.out.println(s.toString());
	}
	
	
	public static void main(String[] args)
	{
		
		Singleton s=Singleton.getInstance1();
		
		for(int i=0;i<10;i++){
			ThreadTest test=new ThreadTest();
			test.start();
		}
	}
	
	
	 
}




具体说明都在上面的链接中,非常详细。。
分享到:
评论

相关推荐

    Java 单例模式线程安全问题

    然而,在多线程环境下,单例模式可能会遇到线程安全问题,因为多个线程可能会同时访问同一个实例,从而导致数据不一致和其他问题。 在 Java 中,单例模式的实现可以使用双重检查锁机制、静态内部类和枚举类型等方式...

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

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

    java单例模式实例

    在多线程环境下,可能会创建多个实例。例如: ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == ...

    Java实现多种单例模式

    这种方法在多线程环境中存在线程安全问题,如果不加同步控制,可能会创建多个实例。 ```java public class SingleInstance1 { private static SingleInstance1 instance; private SingleInstance1() {} public...

    Java单例模式设计

    原始的懒汉单例在多线程环境下不安全,如下所示: ```java public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if...

    Java 单例模式.pptx

    - **线程安全问题**:懒汉式单例模式在多线程环境下可能会导致创建多个实例,因此需要采用同步机制保证线程安全,例如使用`synchronized`关键字。 - **静态内部类方式** - **实现**: ```java class Single3 {...

    使用Java单例模式实现一个简单的日志记录器.txt

    1. **懒汉式(线程不安全)**:实例化发生在getInstance()方法中,但在多线程环境下可能造成多个实例的问题。 2. **懒汉式(线程安全)**:通过synchronized关键字保证线程安全。 3. **饿汉式**:在类加载时就完成了...

    浅议单例模式之线程安全(转)

    在多线程环境下,线程安全的单例模式尤为重要,因为如果不正确实现,可能会导致多个线程同时创建多个实例,违反了单例模式的基本原则。 在Java中,单例模式通常有以下几种实现方式: 1. 饿汉式(静态常量): ...

    Java 单例模式 懒汉模式

    Java 单例模式 懒汉模式 //懒汉式 多线程中不可以保证是一个对象

    Java多线程编程环境中单例模式的实现

    #### 惰性加载在多线程中的问题 然而,在多线程环境中,惰性加载的方式会导致线程安全问题。假设两个线程A和B几乎同时到达`getInstance()`方法,由于`instance`变量当前为`null`,两个线程都会尝试创建新的`...

    java单例模式连接数据库源码

    这种实现方式在多线程环境下不安全,可能导致多个实例的创建。 2. **饿汉式**:在类加载时就完成初始化,保证了线程安全,但不满足懒加载需求。 3. **双重检查锁定(DCL)**:在多线程环境中,确保了单例的唯一性和...

    多线程并发下的单例模式-源码

    该资源是多线程并发下的单例模式-源码,几乎包含了所有方式实现的单例模式,并且能够确保在多线程并发下的线程安全性。 读者可结合本人博客 http://blog.csdn.net/cselmu9?viewmode=list 中的《线程并发之单例模式...

    java单例设计模式 4中实现方式,重点介绍了静态内部类的实现方式

    Java单例设计模式详解 Java单例设计模式是一种创建型设计模式,可以保证一个类只有一个实例,并提供...静态内部类单例模式是四种实现方式中最为常用的,因为它可以避免多线程环境下的同步问题,同时也避免了资源浪费。

    java单例模式的例子

    Java单例模式是一种常见...在实际开发中,应谨慎使用单例模式,尤其是在多线程环境和需要考虑可测试性的场景下,要权衡其利弊。同时,考虑到Java 9及更高版本中的模块化系统,单例模式的使用也需要结合模块化进行考量。

    java中的单例模式

    3. 在多线程环境下,不正确的单例实现可能导致线程安全问题。 4. 单例模式可能会导致难以进行测试,因为它与依赖注入相冲突。 总之,单例模式是一种强大的设计模式,可以有效地管理和控制资源,但也需要根据具体...

    43丨单例模式(下):如何设计实现一个集群环境下的分布式单例模式?1

    传统的单例模式在多进程或多节点的分布式环境中不再适用,因为每个进程或节点都可以独立创建自己的单例实例。要实现分布式环境下的单例,可以采用以下策略: 1. **数据库锁**:在创建单例对象之前,所有节点尝试...

    多线程单例模式并发访问

    总结起来,多线程环境下的单例模式实现需要注意线程安全问题,尤其是懒汉式单例,需要采取适当的同步措施来防止多线程环境下的实例化问题。此外,对于不同场景的需求,可以选择不同的实现方式来优化性能和资源使用。

    Java多线程实战之单例模式与多线程的实例详解

    单例模式是Java多线程编程中最常用的设计模式之一,它的主要作用是确保一个类在应用程序中只有一个实例,并提供一个全局访问点。单例模式有多种实现方式,如饿汉模式、懒汉模式等。下面我们将详细讨论Java多线程实战...

Global site tag (gtag.js) - Google Analytics