- 浏览: 396546 次
- 性别:
- 来自: 重庆
文章分类
- 全部博客 (144)
- java (25)
- hibernate (2)
- spring (6)
- struts (1)
- oracle (14)
- mysql (3)
- jdbc (1)
- 面试经历 (0)
- linux (12)
- 工具小技巧 (7)
- 个人随笔 (0)
- 设计模式 (5)
- jsf (0)
- ejb3.0 (1)
- Web (3)
- jsp&servlet (1)
- Ruby (2)
- JQuery (4)
- 测试 (1)
- javascript (12)
- Android (7)
- asp.net (0)
- php (0)
- 职业发展 (3)
- 励志 (0)
- Struts2 (1)
- CSS (1)
- other (2)
- 性能优化 (1)
- CURL (1)
- scala (2)
- Nginx 配置文件详解 (1)
- resin (1)
- python (1)
- 开源中最好的Web开发的资源 (1)
- hadoop (1)
- idea (2)
- redis (1)
- git (1)
- rails (1)
- tomcat (1)
- springmvc (1)
- VLC (1)
- nginx (1)
- ffmpeg (2)
- tools (1)
最新评论
-
happy.future:
这个注册码好用的,记录了一下 http://www.danie ...
java IntelliJ IDEA 13 注册码 IDEA序列号 License Key -
lpyy00892012:
有问题啊,下拉框会变小啊
jquery easyui三级联动 -
怪兽加outman:
个人还是比较看好GUI Design Studio的,分享一个 ...
推荐两个界面原型设计工具--GUIDesignStudio 和 Mockups For Desktop -
zhanwc:
xzz7175327 写道感谢、、、十分有用!不客气
Css圆角边框 -
xzz7175327:
感谢、、、十分有用!
Css圆角边框
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
结论:在写单例的时候一定要加上双重判断呀~~切记
发表评论
-
Executors的Thread table can't grow past 16383 threads异常
2013-01-30 12:50 1820在使用executors并发编程时候需要注意,如果出现Thr ... -
java代码中动态添加程序执行时间日志
2012-10-26 09:52 2652在写java代码的过程中经常会遇到需要打印一个方法的执行 ... -
java process can not exited
2012-09-28 10:20 1074/** * User: weichun.zhan ... -
JAVA获取CLASSPATH路径
2012-07-04 16:52 784http://www.blogjava.net/tbwshc/ ... -
计算机补码
2012-03-28 16:35 932名词解释: 补码:1 在计算机系统中,数值一律有补码 ... -
Java中HashMap排序和遍历 .
2011-12-02 17:24 9313HashMap排序 1、按照key排序 对于java中 ... -
java开源项目汇总
2011-05-17 15:42 953http://www.open-open.com/index. ... -
OperaMasks
2011-04-19 10:31 930demo:http://demo.operamasks.org ... -
1000个0-9的数字,查找出现次数最多的3个数字.并求这他们出现的次数.
2011-04-06 21:41 5415今天面试碰到 "1000个0-9的数字,查找出现次数 ... -
Java开源 Jsp标签库
2011-02-25 13:52 1699displytag 与Struts结合使用最出名的一个tag主 ... -
阅读优秀代码是提高开发人员修为的一种捷径
2011-02-24 10:57 867原文作者Alan Skorkin是一 ... -
线程池
2010-12-06 17:31 985http://hi.baidu.com/ecspell/blo ... -
JAVA String.format 方法使用介绍
2010-10-25 13:36 3295JAVA String.format 方法使用 ... -
用 Eclipse 插件提高代码质量
2010-10-12 11:12 959用 Eclipse 插件提高代码质量 参考文章. http: ... -
Java代码分析工具——Eclipse插件nWire 1.3发布
2010-09-26 17:34 2974近日,Eclipse插件nWire 1.3发布。nWire可以 ... -
归并算法详解
2010-07-28 13:03 1725MergeSort,归并排序。 [1 ... -
java util date转换成java sql date
2010-06-11 13:26 1812在util date转换成sqldate过程中可以使用new ... -
java获取操作系统类型
2010-05-14 17:12 2607判断当前java程序是运行在windows平台还是运行在lin ... -
Java:回调机制
2010-05-10 14:14 10801. 什么是回调函数 回调函数(callback ... -
关于native
2010-05-10 14:04 1131adj.1. 出生地的, 故乡的, 本国的2. 当地(人)的; ...
相关推荐
设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
一个单例模式的晋级过程(饿汉-懒汉-DCL-IoDH-枚举) ...单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一
java基础知识代码实现,包括冒泡算法,快速算法,九九乘法表,创建多线程的方式,自定义链表,递归使用方式,创建单例等,可解压代码直接运行测试学习!
避免使用Java序列化14讲多线程之锁优化(下):使用乐观锁优化并行操作16讲多线程调优(下):如何优化多线程上下文切换17讲并发容器的使用:识别不同场景下最优容器21讲深入JVM即时编译器JIT,优化Java编译25讲答疑...
多线程与并发 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基础篇包括: 1. Java环境搭建、Java快速入门、IDEA开发工具 ...11. 多线程 12. 网络编程 13. 单元测试、反射、注解、动态代理 14. XML、解析、工厂模式和装饰模式
struts1.2 Action是单例模式的并且必须是线程安全的,因为仅有一个Action的实例来处理所有的请求。 单例策略限制了Struts1.2 Action能做的事情,并且开发时特别小心。Action资源必须是线程安全的或同步的。 struts...
3.1多线程的团队协作:同步控制 3.2线程复用:线程池 3.3不要重复发明轮子:jdk的并发容器 3.4使用jmh进行性能测试 3.2线程复用:线程池 3.3不要重复发明轮子:JDK的并发容器 3.4使用JMH进行性能测试 实战Java高并发...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 ...
实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 250 实例...
实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 ...
实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 ...
实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 250 实例...
总结了一些实用的demo 包括: 1.建立索引 2.通过IKAnalyzer搜索中文关键词 3.复杂的多字段搜索 4.多线程并发搜索,通过contiperf测试,详见:...lucene支持多线程并发搜索和建索引,只要IndexWriter是单例模式即可
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
构建一个实现简单功能的服务器知识基础实现功能实现...多线程 SAX方式的XML读取 反射 单例模式 实现功能 封装Request,实现转发和获取参数功能 封装Response实现简单的外网页重定向 自定义服务器端口、error页面、欢
通过单例模式获取到对象后。就是只有一个对象的类 方法全部都是非static修饰的,调用方式:对象名.方法名(...); 4. 工具类命名: XxxUtil、XxxUtils、XxxTool、XxxTools 3. jar 包 (掌握)...
本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...