当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

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

发表于: 2013-11-24   作者:alleni123   来源:转载   浏览次数:
摘要: 参考网址如下: 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 stat
参考网址如下:
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单例在多线程环境中的实现

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
java中的单例模式 HK学习笔记 首先定义一个皇帝 Emperor.java public class Emperor { private stat
单例模式的本质是在运行过程中,某个类只能实例化一个对象;下面是单例模式最基本的实现方式 packag
基本概念 Singleton 是一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点.对
单例设计模式-------懒汉式,饿汉式 单例设计模式是一种很常见的设计模式 在这里介绍两种单例设计模
多线程之 单例设计模式 饿汉式 多线程安全代码: 代码1: /** * 饿汉式 * */ class Single { private
定义: 确保某一个类只有一个实例,而且自动实例化并向整个系统提供这个实例。 代码: Singleton类
保证一个类在内存中的对象唯一性,需要以下三步: 1. 不允许其他模块用new创建该类对象。(即把该类
使用多线程模拟实现银行转帐功能,先看看未使用同步的代码: package com.test.current; public cla
单例模式(JAVA vs Scala) Singlton是一种为许多人熟知的设计模式,到了Scala这里,它成了语言的一部
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39784403 单例模式(Singleton):
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号