- 浏览: 403758 次
- 性别:
- 来自: 重庆
文章分类
- 全部博客 (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 1875在使用executors并发编程时候需要注意,如果出现Thr ... -
java代码中动态添加程序执行时间日志
2012-10-26 09:52 2735在写java代码的过程中经常会遇到需要打印一个方法的执行 ... -
java process can not exited
2012-09-28 10:20 1117/** * User: weichun.zhan ... -
JAVA获取CLASSPATH路径
2012-07-04 16:52 823http://www.blogjava.net/tbwshc/ ... -
计算机补码
2012-03-28 16:35 972名词解释: 补码:1 在计算机系统中,数值一律有补码 ... -
Java中HashMap排序和遍历 .
2011-12-02 17:24 9351HashMap排序 1、按照key排序 对于java中 ... -
java开源项目汇总
2011-05-17 15:42 986http://www.open-open.com/index. ... -
OperaMasks
2011-04-19 10:31 996demo:http://demo.operamasks.org ... -
1000个0-9的数字,查找出现次数最多的3个数字.并求这他们出现的次数.
2011-04-06 21:41 5493今天面试碰到 "1000个0-9的数字,查找出现次数 ... -
Java开源 Jsp标签库
2011-02-25 13:52 1734displytag 与Struts结合使用最出名的一个tag主 ... -
阅读优秀代码是提高开发人员修为的一种捷径
2011-02-24 10:57 906原文作者Alan Skorkin是一 ... -
线程池
2010-12-06 17:31 1027http://hi.baidu.com/ecspell/blo ... -
JAVA String.format 方法使用介绍
2010-10-25 13:36 3327JAVA String.format 方法使用 ... -
用 Eclipse 插件提高代码质量
2010-10-12 11:12 1006用 Eclipse 插件提高代码质量 参考文章. http: ... -
Java代码分析工具——Eclipse插件nWire 1.3发布
2010-09-26 17:34 3011近日,Eclipse插件nWire 1.3发布。nWire可以 ... -
归并算法详解
2010-07-28 13:03 1758MergeSort,归并排序。 [1 ... -
java util date转换成java sql date
2010-06-11 13:26 1849在util date转换成sqldate过程中可以使用new ... -
java获取操作系统类型
2010-05-14 17:12 2669判断当前java程序是运行在windows平台还是运行在lin ... -
Java:回调机制
2010-05-10 14:14 11331. 什么是回调函数 回调函数(callback ... -
关于native
2010-05-10 14:04 1178adj.1. 出生地的, 故乡的, 本国的2. 当地(人)的; ...
相关推荐
1. **懒汉式(线程不安全)**:实例化发生在getInstance()方法中,但在多线程环境下可能造成多个实例的问题。 2. **懒汉式(线程安全)**:通过synchronized关键字保证线程安全。 3. **饿汉式**:在类加载时就完成了...
Java单例模式是一种常见...在实际开发中,应谨慎使用单例模式,尤其是在多线程环境和需要考虑可测试性的场景下,要权衡其利弊。同时,考虑到Java 9及更高版本中的模块化系统,单例模式的使用也需要结合模块化进行考量。
需要注意的是,虽然单例模式在很多情况下都很实用,但也有一些潜在的问题,如单例的生命周期与应用程序一致,可能导致资源无法释放,增加内存泄漏的风险。此外,过度依赖单例可能导致代码之间的紧密耦合,不利于测试...
Java单例模式是设计模式中的一种,在软件开发中扮演着重要的角色。单例模式的目的是保证一个类仅有一个实例,并且提供一个全局访问点。在Java中实现单例模式有多种方法,主要包括懒汉式、饿汉式、注册式(使用容器)...
单例模式是设计模式中的一种,它在Java编程中被广泛应用,特别是在需要全局共享资源或者控制实例数量的情况下。单例模式的基本思想是确保一个类在任何情况下都只有一个实例,并提供一个全局访问点来获取这个唯一的...
在第一次调用getInstance()时才创建实例,但线程不安全,多线程环境下可能导致多个实例。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static ...
在Java中,为了确保多线程环境下的正确性,我们可以使用synchronized关键字来保证同步,但这会引入性能开销。DCL模式通过在实例化单例时使用 volatile 关键字和双层检查,解决了这个问题。volatile关键字保证了多...
由于实例在类加载时就已经创建,所以即使没有使用,内存空间也被占用了,但这也保证了在多线程环境下的安全性,提高了性能。 3. **登记式单例**: 登记式单例是一种更灵活的实现方式,它维护了一个存储所有单例...
下面将详细介绍七种常见的单例模式实现方式,并结合多线程环境和反序列化测试进行讨论。 1. **饿汉式单例**: 这是最简单的单例实现,它在类加载时就创建了实例,因此是线程安全的。 ```java public class ...
这里的 `getInstance()` 方法使用了 `synchronized` 关键字进行同步,保证了在多线程环境下的线程安全。但是,同步操作会降低性能,因为每次调用都需要进行锁的获取和释放。 为了解决懒汉式单例模式的性能问题,有...
单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。...同时,需要注意的是,单例模式虽然常用,但在某些情况下可能不适合,如当需要多个实例或者类需要被继承时。
这是最简单的一种实现方式,它在类加载时就完成了实例化,避免了多线程同步问题。 ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} ...
虽然单例模式在某些场景下很有用,但过度使用或在不适用的场景下使用可能会导致设计复杂性增加、测试困难以及难以解耦等问题。在设计时应根据实际情况选择是否使用单例模式。 总结起来,Java 单例模式是一种控制类...
但是,这种方式在多线程环境下存在线程安全问题,如果不进行同步控制,可能会创建多个实例。在上述代码中,`getInstance()`方法使用了`synchronized`关键字进行同步,确保了线程安全,但这也可能导致性能下降,因为...
总结来说,本文档通过介绍单例模式在多核多线程环境下的性能提升方法,探讨了Java设计模式在现代大型系统应用中的优化策略,并对JDK未来的设计模式实现提出期望,为Java开发人员提供了宝贵的技术指导和参考。
但是这种方式在多线程环境下不安全,可能导致多个线程各自创建一个实例。尽管如此,它具有惰性实例化的优点,即只有在第一次需要时才创建实例。 2. **安全的线程实现**: 在多线程环境下,为了解决简单实现的问题...