`
高军威
  • 浏览: 176875 次
  • 性别: 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设计模式-单例模式详解,包含三种模式式:饿汉,懒汉,登记式,以及线程多同步的处理

    Qt多工程调用单例实现,带线程锁

    本资源包含有三个子项目工程,实现的是通过DataSource做数据管理,DataSource是一个单例类,做了测试在不同类中调用单例函数依旧能保证唯一性

    Qt线程安全单例模式写日志模式

    保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例,具有线程安全,多线程测试通过。 1.打开日志并创建日志文件夹 默认为程序启动路径 2.清理日志文件下日志数量 默认保留90...

    设计模式经典案例之单例模式

    单例模式主要有懒汉式和饿汉式两种实现,饿汉式不会有线程安全的问题,但是提前构造对象占用了一定...懒汉式应使用DCL机制来避免多线程竞争资源的问题,并且懒汉式可以在需要使用对象的时候才去创建对象,节省了资源。

    7种单例模式

    设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试

    27_多线程_第2天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义

    27_多线程_第2天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义

    多线程(20)单例设计模式1

    1. 饿汉式 2. 懒汉式 3.Holder方式 4.枚举方式

    单例模式,single

    单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时...

    Java设计模式之单例模式讲解

    入名所示,该文件为最详细的Java单例模式讲解并附有讲解代码。主要讲了单例模式的几种方法,懒汉...饿汉模式和静态内部类模式如何设置能够避免使用反射方法获取多个实列,以及实现了序列化的类如何避免创建多个实列。

    27_多线程_第2天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义.doc

    多线程的知识点讲解,,,线程安全,线程同步,,等待唤醒机制,单例设计模式,,,,,,,,,让你更好理解多线程

    java 多线程单例模式详解

    单例设计模式: 1、构造函数私有 2、定义类型为本身类型的成员 3、类中提供一个公共的并且静态的获取本类实例的方法

    线程相关的单例模式

    本工程实现了一种利用静态工厂和单例模式两种模式思路设计的线程相关的单例模式。

    JAVA多线程并发下的单例模式应用

    单例模式应该是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了,今天给大家分享一个我在开发过程中遇到的单例模式的应用。 首先我们先来看一下单例模式的定义: 一个类有...

    单例模式详解.pdf

    2、掌握 IDEA 环境下的多线程调试方式。 3、掌握保证线程安全的单例模式策略。 4、掌握反射暴力攻击单例解决方案及原理分析。 5、序列化破坏单例的原理及解决方案。 6、掌握常见的单例模式写法。

    C++实现的单例模式代码

    本人使用C++实现的单例模式,实现方式有三种,包括单线程下的,多线程下的代码。

    java单例模式完全剖析

    单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时...

    单例模式连接数据库步骤

    单例模式是一种设计模式,它可以确保一个类只有一个实例,并提供了一个全局访问点来访问这个实例。在连接数据库时,单例模式可以确保数据库连接的唯一性和安全性。 第一步:创建Properties文件 在项目中创建一个...

    Java中线程同步和线程协作学习笔记

    java核心技术-多线程的概念及多线程单例设计模式的应用-懒汉模式、饿汉模式、优化懒汉

    Objective C 单例模式设计源码

    平时,我们常用单例模式的地方通常是多线程。 因为Objective C传承了Smalltalk语言,所以在Objective C中实现单例模式和C++和C#以及Java都不太一样。因为要保证类型对象的单一性,所以就要考虑Objective C在实例化...

Global site tag (gtag.js) - Google Analytics