`
高军威
  • 浏览: 181070 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程(多线程-单例设计模式)

阅读更多
多线程之 单例设计模式
饿汉式 多线程安全代码:
代码1:
/**
 * 饿汉式
 * */
class Single {
	private static final Single s = new Single();
	private Single(){}
	static Single getInstance()
	{
		return s;
	}
	public void show()
	{
		System.out.println(Thread.currentThread().getName()+":"+s);
	}
	
}
class A implements Runnable{
	@Override
	public void run() {
		Single.getInstance().show();
	}
}

class Test
{
	public static void main(String[] args) {
		A a = new A();
		Thread b = new Thread(a);
		Thread c = new Thread(a);
		Thread e = new Thread(a);
		Thread f = new Thread(a);
		
		b.start();
		try { Thread.sleep(100);} catch (InterruptedException ex) {};
		c.start();
		try { Thread.sleep(100);} catch (InterruptedException ex) {};
		e.start();
		try { Thread.sleep(100);} catch (InterruptedException ex) {};
		f.start();
		
	}
}


运行结果:


多线程安全性:多线程安全
分析:这种静态初始化的方法是自己被加载时就自己实例化,被形象的称之为饿汉式单例类。而原先的单例模式处理方式要在第一次被引用的时候才会被实例化,就被称为懒汉式单例类。
优缺点:这样导致类加载慢,但运行快。


不安全懒汉式示例:
代码2:
class Single {
	private static Single s = null;
	private Single(){}
	
	public static Single getInstance()
	{
		if(s==null)
			return s = new Single();
		return s;
	}
	public void show()
	{
		System.out.println(Thread.currentThread().getName()+":"+s);
	}
	
}
class A implements Runnable{
	@Override
	public void run() {
		Single.getInstance().show();
	}
}
class Test
{
	public static void main(String[] args) {
		A a = new A();
		Thread b = new Thread(a);
		Thread c = new Thread(a);
		Thread e = new Thread(a);
		Thread f = new Thread(a);
		Thread b1 = new Thread(a);
		Thread c1 = new Thread(a);
		Thread e1 = new Thread(a);
		Thread f1 = new Thread(a);
		
		b.start();
		c.start();
		e.start();
		f.start();
		b1.start();
		c1.start();
		e1.start();
		f1.start();
		
	}
}

运行结果:


懒汉式多线程安全单例类:
代码3:
/**
 * 多线程安全 懒汉式
 * */
class Single {
	private volatile static Single s = null;
	private Single(){}
	
	public static Single getInstance()
	{
		if(s==null)
		{
			synchronized (Single.class) {
				if(s==null)
					return s = new Single();
			}
		}
		return s;
	}
	public void show()
	{
		System.out.println(Thread.currentThread().getName()+":"+s);
	}
	
}
class A implements Runnable{
	@Override
	public void run() {
		Single.getInstance().show();
	}
}
class Test
{
	public static void main(String[] args) {
		A a = new A();
		Thread b = new Thread(a);
		Thread c = new Thread(a);
		Thread e = new Thread(a);
		Thread f = new Thread(a);
		Thread b1 = new Thread(a);
		Thread c1 = new Thread(a);
		Thread e1 = new Thread(a);
		Thread f1 = new Thread(a);
		
		b.start();
		c.start();
		e.start();
		f.start();
		b1.start();
		c1.start();
		e1.start();
		f1.start();
		
	}
}


运行结果:


分析:使用了同步代码块,这样每个线程都必须等,当前执行的线程完成操作后才能进去,达到多线程安全编程;可这样也是程序运行效率下降;在同步代码块外在判断一次是否为null,这样程序的运行效率就就会好点了。

同步锁:静态的同步方法,使用的锁是该方法所在类的字节码文件对象,类名.class。

优缺点:加载类快,对象实例延迟加载,第一次运行较慢,还是很不错的。

这个测试有点麻烦,测试好多次才能看到问题,建议大家可以结合使用 线程的sleep()方法来测试,见效快。

分享到:
评论

相关推荐

    java设计模式----单例模式

    在Java编程语言中,设计模式是一种经过验证的解决常见软件设计问题的最佳实践。单例模式是其中最常用的一种,它的核心思想是确保一个类只有一个实例,并提供全局访问点。单例模式的应用场景包括:控制资源的访问、...

    常见设计模式-单例模式

    设计模式-单例模式 单例模式是一种常见的设计模式,它的主要作用是确保在内存中仅创建一次对象,并提供一个全局访问点。单例模式有两种类型:饿汉类型和懒汉类型。 饿汉类型的单例模式是在类加载时创建对象,例如...

    设计模式-单例模式

    **设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...

    设计模式-单例设计模式

    ### 设计模式—单例设计模式详解 #### 定义 单例模式是一种常见的创建型设计模式,其核心思想在于确保一个类仅有一个实例存在,并且该实例由该类自行创建,随后向整个系统提供这一唯一实例。 #### 类图解析 在设计...

    设计模式--单例模式java例子

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于可以控制实例的数量,减少资源消耗,同时便于协调整个...

    一例读懂设计模式-单例模式、简单工厂模式.zip

    本资源“一例读懂设计模式-单例模式、简单工厂模式.zip”旨在帮助初学者通过实例深入理解这两种重要设计模式:单例模式和简单工厂模式。以下是关于这两个模式的详细讲解。 1. **单例模式**: 单例模式是一种限制类...

    设计模式ForiOS-02-单例模式.pdf

    单例模式是一种软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在iOS开发中非常常见,因为许多系统类如UIApplication、NSFileManager等都采用...

    1.设计模式-单例设计模式1

    单例设计模式是一种常用的设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点。在Java中,实现单例模式通常有多种方式,包括懒汉模式、饿汉模式、静态内部类以及枚举类型。 1. **懒汉模式**: 懒汉...

    c++设计模式-单例模式

    **单例模式**是软件设计模式中的一种,属于创建型模式。在C++中,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于管理共享资源,如数据库连接、日志系统或者配置文件等。单例模式的主要...

    设计模式 For iOS-02-单例模式

    单例模式是一种常用的软件设计模式,特别是在iOS开发中,它确保一个类仅有一个实例,并提供一个全局访问点。iOS SDK中广泛应用了单例模式,比如UIApplication和NSFileManager等类就是以单例形式存在。 在iOS开发中...

    设计模式-单例模式(讲解及其实现代码)

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供全局访问点。这种模式在许多场景下非常有用,比如控制共享资源、管理系统级别的对象,如数据库连接池或者线程池等。单例模式的核心在于限制类的...

    java设计模式-单例.pdf

    ### Java设计模式——单例模式详解 #### 一、单例模式概述 单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景...

    Java-设计模式-单例模式-实现源码(简单实现、双重检查锁、静态内部类、枚举类)

    单例模式是软件设计模式中的一种经典模式,其主要目的是保证一个类只有一个实例,并提供一个全局访问点。在Java中,有多种实现单例模式的方法,包括简单实现、双重检查锁定(Double-Checked Locking)、静态内部类和...

    C#设计模式学习与演变过程-2-单例模式

    单例模式是软件设计模式中的一种经典模式,它旨在确保一个类只有一个实例,并提供一个全局访问点。在C#编程中,单例模式的应用广泛,特别是在需要频繁实例化然后销毁的对象,或者创建对象需要消耗大量资源的情况下,...

    IOS应用源码Demo-单例模式-毕设学习.zip

    在iOS应用开发中,单例模式是一种常用的编程设计模式,它确保了类只有一个实例,并提供一个全局访问点。这个模式在iOS开发中的应用非常广泛,特别是在处理系统资源、网络请求、数据存储等需要全局共享的对象时。在...

    优秀的设计模式示例-单例模式

    单例模式是软件设计模式中的一种经典模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制共享资源、管理系统级别的服务或者简化对象间的交互。以下是对单例模式的详细...

    C#源代码-单例设计模式.zip

    单例设计模式是一种常用的设计模式,它在软件工程中用于控制类的实例化过程,确保一个类在整个系统中只有一个实例存在。在C#编程中,单例模式的应用非常广泛,尤其是在处理全局配置、数据库连接或者日志记录等场景。...

    java-单例模式几种写法

    单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。在Java中,实现单例模式有多种方法,每种方法都有其特点和适用场景。以下是对这六种常见单例模式实现方式的...

    乐在其中设计模式(C#)-单例模式(SingletonPattern)[收集].pdf

    但是,单例模式也有一些潜在的问题,如测试困难(因为无法通过构造函数注入依赖)、难以进行并行编程(多线程环境下需要特殊处理)以及可能导致全局状态的滥用等。 接下来是适配器模式(Adapter Pattern)的介绍。...

Global site tag (gtag.js) - Google Analytics