`
dyllove98
  • 浏览: 1379006 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:38212
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:78424
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:131588
社区版块
存档分类
最新评论

多线程下的单例设计模式

 
阅读更多

众所周知,单例模式中,构造方法是私有化的,通过静态方法内部调用构造函数返回该类的实例对象。常见的代码如下所示:

public class Singleton {
	private static Singleton singletonObj;	
	private Singleton(){}	
	public static Singleton getInstance(){
		if(singletonObj == null){
			singletonObj = new Singleton();
		}
		return singletonObj;
	}
}

 

在单线程的情况下,确实可以保证只有一个实例,但是在多线程的情况下,就会发生意想不到的情况。

创建一个TestSingleton类,如下:

public class TestSingleton implements Runnable {

	private Singleton s = null;
	
	public Singleton getS() {
		return s;
	}

	public void setS(Singleton s) {
		this.s = s;
	}

	public static void main(String[] args) {
		TestSingleton ts1 = new TestSingleton();
		TestSingleton ts2 = new TestSingleton();
		Thread t1 = new Thread(ts1);
		Thread t2 = new Thread(ts2);
		t1.start();
		t2.start();
		
		Singleton s1 = ts1.getS();
		Singleton s2 = ts2.getS();
		
		System.out.println(s1 == s2);
	}

	@Override
	public void run() {
		
		s = Singleton.getInstance();
	}
}

 

运行结果返回 false 

在多线程的环境中需要考虑同步的问题,对上述单例模式的代码进行修改,如下:

public static Singleton getInstance() {

		if (singletonObj == null) {
			synchronized (Singleton.class) {
				if (singletonObj == null) {
					singletonObj = new Singleton();
				}
			}
		}
		return singletonObj;
	}

 

重新运行上述TestSingleton ,返回结果 true 此时,保证即使是在多线程的环境下,依然能够保持单例模式的正确性。

分享到:
评论

相关推荐

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

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

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

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

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

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

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

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

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

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

    java 多线程单例模式详解

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

    线程相关的单例模式

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

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

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

    7种单例模式

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

    单例模式,single

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

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

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

    单例模式详解.pdf

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

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

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

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

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

    java单例模式完全剖析

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

    单例模式详解

    Java设计模式-单例模式详解,包含三种模式式:饿汉,懒汉,登记式,以及线程多同步的处理

    Objective C 单例模式设计源码

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

    多线程基础个人总结思维导图

    包括进程、线程概念;同步函数、同步代码块;多线程安全问题:售票问题;单例设计模式;死锁

    Java多线程19项全面训练.pdf

    Java精通多线程19项目全面训练源码(线程安全、线程同步、等待唤醒机制、单例设计模式)

Global site tag (gtag.js) - Google Analytics