`

java单例模式在多线程环境下的测试

    博客分类:
  • java
 
阅读更多

java单例模式在多线程环境下的测试,进攻自己学习和复习用.

1. 不加双重判断, 会生成2个不同的对象. 代码如下:

 

package com.thred;

import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestSingleton {

	private static TestSingleton s = null;
	
	private TestSingleton() {}

	public static TestSingleton getInstance() {
		if (s == null) {
			System.out.println( new Date() + " " + Thread.currentThread().getName() + "-1->" +  s);
			try {
				Thread.sleep(1);
				System.out.println( new Date() + " " + Thread.currentThread().getName() + "-2->" +  s);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (TestSingleton.class){
				//if(s == null){
					System.out.println( new Date() + " " + Thread.currentThread().getName() + "-3->" +  s);
					s = new TestSingleton();
					System.out.println( new Date() + " " + Thread.currentThread().getName() + "-4->" +  s);
				//}else{
				//	System.out.println("s isn't null");
				//}
			}
			
		}
		return s;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		ExecutorService service = Executors.newFixedThreadPool(10);
		for(int i = 0 ;i < 2;i++){
			service.submit(new Runnable(){
				public void run(){
					String str =   new Date() +" " +  Thread.currentThread().getName() + "-run invoke->" +  TestSingleton.getInstance().toString();
					System.out.println(str);
				}
			});
		}
	}
}

 

测试结果,会生成2个不同的对象,不是单例,在第四步的没加判断会new 对象.

Mon Jul 23 22:22:54 CST 2012 pool-1-thread-1-1->null
Mon Jul 23 22:22:54 CST 2012 pool-1-thread-2-1->null
Mon Jul 23 22:22:54 CST 2012 pool-1-thread-1-2->null
Mon Jul 23 22:22:54 CST 2012 pool-1-thread-1-3->null
Mon Jul 23 22:22:54 CST 2012 pool-1-thread-1-4->com.thred.TestSingleton@fa7e74
Mon Jul 23 22:22:54 CST 2012 pool-1-thread-1-run invoke->com.thred.TestSingleton@fa7e74
Mon Jul 23 22:22:54 CST 2012 pool-1-thread-2-2->com.thred.TestSingleton@fa7e74
Mon Jul 23 22:22:54 CST 2012 pool-1-thread-2-3->com.thred.TestSingleton@fa7e74
Mon Jul 23 22:22:54 CST 2012 pool-1-thread-2-4->com.thred.TestSingleton@133796
Mon Jul 23 22:22:54 CST 2012 pool-1-thread-2-run invoke->com.thred.TestSingleton@133796

 

2.加双重判断: 在同步代码块中加入判断,只贴出不同的部分.

 

synchronized (TestSingleton.class){
	if(s == null){
		System.out.println( new Date() + " " 
			+ Thread.currentThread().getName() + "-3->" +  s);
		s = new TestSingleton();
		System.out.println( new Date() + " " 
			+ Thread.currentThread().getName() + "-4->" +  s);
	}else{
		System.out.println("s isn't null");
	}
}

 

 

测试结果: 返回同一个对象,是单例

Mon Jul 23 22:27:11 CST 2012 pool-1-thread-2-1->null
Mon Jul 23 22:27:11 CST 2012 pool-1-thread-1-1->null
Mon Jul 23 22:27:11 CST 2012 pool-1-thread-2-2->null
Mon Jul 23 22:27:11 CST 2012 pool-1-thread-2-3->null
Mon Jul 23 22:27:11 CST 2012 pool-1-thread-2-4->com.thred.TestSingleton@183f74d
Mon Jul 23 22:27:11 CST 2012 pool-1-thread-2-run invoke->com.thred.TestSingleton@183f74d
Mon Jul 23 22:27:11 CST 2012 pool-1-thread-1-2->com.thred.TestSingleton@183f74d
s isn't null
Mon Jul 23 22:27:11 CST 2012 pool-1-thread-1-run invoke->com.thred.TestSingleton@183f74d

 

 结论:在写单例的时候一定要加上双重判断呀~~切记

分享到:
评论

相关推荐

    7种单例模式

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

    实验1 Java环境搭建.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    一个单例模式的晋级过程(饿汉-懒汉-DCL-IoDH-枚举)

    一个单例模式的晋级过程(饿汉-懒汉-DCL-IoDH-枚举) ...单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一

    java基础知识代码实现,包括冒泡算法,快速算法,九九乘法表,创建多线程的方式,自定义链表,递归使用方式,创建单例等。javaBasicGrammar.zip

    java基础知识代码实现,包括冒泡算法,快速算法,九九乘法表,创建多线程的方式,自定义链表,递归使用方式,创建单例等,可解压代码直接运行测试学习!

    Java性能调优实战——覆盖80%以上的Java应用调优场景

    避免使用Java序列化14讲多线程之锁优化(下):使用乐观锁优化并行操作16讲多线程调优(下):如何优化多线程上下文切换17讲并发容器的使用:识别不同场景下最优容器21讲深入JVM即时编译器JIT,优化Java编译25讲答疑...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    多线程与并发 GC机制 GC收集器类型 串行 CMS 并行 G1 算法 复制 标记清理 标记整理 分区 新生代 eden survivor 老年代(old区) 永久代(perm区) 版本变化 1.5 1.6 1.7 1.8 1.9 IO/NIO IO...

    Java基础最全笔记文档

    Java基础笔记分为 Java基础篇 和 Java加强篇 Java基础篇包括: 1. Java环境搭建、Java快速入门、IDEA开发工具 ...11. 多线程 12. 网络编程 13. 单元测试、反射、注解、动态代理 14. XML、解析、工厂模式和装饰模式

    JAVA-SSH面试题

    struts1.2 Action是单例模式的并且必须是线程安全的,因为仅有一个Action的实例来处理所有的请求。 单例策略限制了Struts1.2 Action能做的事情,并且开发时特别小心。Action资源必须是线程安全的或同步的。 struts...

    实战Java高并发程序设计(第2版)PPT模板.pptx

    3.1多线程的团队协作:同步控制 3.2线程复用:线程池 3.3不要重复发明轮子:jdk的并发容器 3.4使用jmh进行性能测试 3.2线程复用:线程池 3.3不要重复发明轮子:JDK的并发容器 3.4使用JMH进行性能测试 实战Java高并发...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    java范例开发大全源代码

     实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158 同学聚会(工厂方法模式) 244  实例159 图书展(抽象工厂模式) 246  实例160 汽车适配器(Adapter适配器模式) 248 ...

    java范例开发大全

    实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 250 实例...

    Java范例开发大全 (源程序)

     实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158 同学聚会(工厂方法模式) 244  实例159 图书展(抽象工厂模式) 246  实例160 汽车适配器(Adapter适配器模式) 248  8.4 ...

    Java范例开发大全(全书源程序)

    实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 ...

    java范例开发大全(pdf&源码)

    实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 250 实例...

    apache lucene 4.10.0入门单元测试代码demo

    总结了一些实用的demo 包括: 1.建立索引 2.通过IKAnalyzer搜索中文关键词 3.复杂的多字段搜索 4.多线程并发搜索,通过contiperf测试,详见:...lucene支持多线程并发搜索和建索引,只要IndexWriter是单例模式即可

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    Java基础练习-使用基础知识编写一个服务器

    构建一个实现简单功能的服务器知识基础实现功能实现...多线程 SAX方式的XML读取 反射 单例模式 实现功能 封装Request,实现转发和获取参数功能 封装Response实现简单的外网页重定向 自定义服务器端口、error页面、欢

    day020-继承加强和设计模式代码和笔记.rar

    通过单例模式获取到对象后。就是只有一个对象的类 方法全部都是非static修饰的,调用方式:对象名.方法名(...); 4. 工具类命名: XxxUtil、XxxUtils、XxxTool、XxxTools 3. jar 包 (掌握)...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...

Global site tag (gtag.js) - Google Analytics