- 浏览: 1336328 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
无论如何,要编写一个多执行绪安全(thread-safe)的程式总是困难的,为了使用的共用资源,您必须小心的对共用资源进行同步,同步带来一定的效能延迟,而另一方面,在处理同步的时候,又要注意物件的锁定与释放,避免产生死结,种种因素都使得编写多执行绪程式变得困难。
Thread-Specific Storage模式尝试从另一个角度来解释多执行绪共用资源的问题,其思考点很简单,即然共用资源这么困难,那么就干脆不要共用,何不为每个执行绪创造一个资源的复本,将每一个执行绪存取资料的行为加以隔离,其实现的方法,就是给予每一个执行绪一个特定空间来保管该执行绪所独享的资源,也因此而称之为 Thread- Specific Storage模式。
在Java中可以使用java.lang.ThreadLocal来实现这个模式,这个类别是从1.2之后开始提供,不过先来看看,如何自行实现一个简单的ThreadLocal类别:
- ThreadLocal.java
import java.util.*; public class ThreadLocal { private Map storage = Collections.synchronizedMap(new HashMap()); public Object get() { Thread current = Thread.currentThread(); Object o = storage.get(current); if(o == null && !storage.containsKey(current)) { o = initialValue(); storage.put(current, o); } return o; } public void set(Object o) { storage.put(Thread.currentThread(), o); } public Object initialValue() { return null; } }
可以看到程式中使用执行绪本身作为key值,并将所获得的资源放在Map物件中,如果第一次使用get(),也配置一个空间给执行绪,而 initialValue()可以用来设定什么样的初值要先储存在这个空间中,在这边先简单的设定为null。
现在假设有一个原先在单执行绪环境下的资源SomeResource,现在考虑要该其在多执行绪环境下使用,若不想考虑复杂的执行绪共用互斥问题,此时可以使用ThreadLocal类别来使用SomeResource,例如:
- Resource.java
public class Resource { private static final ThreadLocal threadLocal = new ThreadLocal(); public static SomeResource getResource() { SomeResource resource = (SomeResource) threadLocal.get(); if(resource == null) { resource = new SomeResource(); threadLocal.set(resource); } return resource; } }
上面所实作的ThreadLocal类别只是一个简单的示范,您可以使用java.lang.ThreadLocal来实现Thread- Specific Storage模式,以获得更好的效能,在这边简单的示范一个Log程式,它可以记录每个执行绪的活动,所使用的是 java.util.logging中的类别:
- SimpleThreadLogger.java
import java.io.*; import java.util.logging.*; public class SimpleThreadLogger { private static final ThreadLocal threadLocal = new ThreadLocal(); public static void log(String msg) { getThreadLogger().log(Level.INFO, msg); } private static Logger getThreadLogger() { Logger logger = (Logger) threadLocal.get(); if(logger == null) { try { logger = Logger.getLogger( Thread.currentThread().getName()); // Logger 预设是在主控台输出 // 我们加入一个档案输出的Handler // 它会输出XML的记录文件 logger.addHandler( new FileHandler( Thread.currentThread().getName() + ".log")); } catch(IOException e) {} threadLocal.set(logger); } return logger; } }
可以使用下面这个程式来测试:
- LoggerTest.java
public class LoggerTest { public static void main(String[] args) { new TestThread("thread1").start(); new TestThread("thread2").start(); new TestThread("thread3").start(); } } class TestThread extends Thread { public TestThread(String name) { super(name); } public void run() { for(int i = 0; i < 10; i++) { SimpleThreadLogger.log(getName() + ": message " + i); try { Thread.sleep(1000); } catch(Exception e) { SimpleThreadLogger.log(e.toString()); } } } }
执行LoggerTest可以在主控台上看到输出,并可以在同一目录下找到三个log档,分别记录了三个执行绪的活动,透过 ThreadLocal,不用撰写复杂的执行绪共用互斥逻辑。
Thread-Specific Storage模式的意义之一,就是“有时不共用是好的”,如果共用会产生危险,那就不要共用,当然,这种方式所牺牲掉的就是空间,您必须为每一个执行绪保留它们独立的空间,这是一种以空间换取时间与安全性的方法。
发表评论
-
J2ME 的优化措施
2012-07-11 02:15 1178常见的性能瓶颈:1.文件的读写和网络的操作2.CPU3.内存4 ... -
JAVA缓存 - Cache类
2011-09-28 11:04 4619JAVA缓存有两种: 一、文件缓存,是指把数据存储在磁盘上 ... -
Java注释(Annotation)详解
2011-03-31 18:22 2404注释:在一个类中可以有多个,类似于一个类可以有多个实例; ... -
Java去除字符串中的空格、回车、换行符、制表符
2011-02-15 11:06 3557本方法采用的是java的正则表达式 import jav ... -
线程池编程
2011-01-23 21:02 1107线程池编程 -
设计模式:Java语言中的应用
2011-01-23 20:59 1325设计模式:Java语言中的应用 -
java用了中间缓存变量
2011-01-23 18:37 2404Java语法、语言特性与机制 2011-01-22 19:1 ... -
Java集合总结
2011-01-19 11:16 3825Set:不区分元素的顺序,不允许出现重复的值list:区分元素 ... -
java.util.current的主要方法简介
2011-01-08 22:18 3438JDK5中增加了Doug Lea的并发库,这一引进给java线 ... -
线程池
2011-01-08 21:03 2073对每个客户都分配一个新的工作线程。当工作线程与客户通信结束,这 ... -
SimpleDateFormat
2010-12-10 16:11 1366With SimpleDateFo ... -
使用 XStream 在 JavaBean 与 XML/JSON 之间相互转换
2010-12-10 14:24 1565XML 和 JSON 是当今常用的两种数据描述与传输的格式,特 ... -
Linux上JDK的 安装和卸载 详细 (转)
2010-11-27 15:48 1928安装 1. 去http://java.sun.com ... -
java 路径问题
2010-11-26 16:21 13051.JSP/Servlet中获得当前应用的相对路径和绝对路径 ... -
对synchronized(this)的一些理解
2010-11-25 23:41 1029一、当两个并发线程访问同一个对象object中的这个synch ... -
Externalizable
2010-11-20 22:41 1365被Serializable接口声明的类的对象的内容都将被序列化 ... -
Java实现文件拷贝的4种方法(转)
2010-11-15 12:33 1253... -
Java内省和反射机制三步曲之 - 内省
2010-11-11 12:15 1346经过多方面的资料搜集整理,写下了这篇文章,本文主要讲解java ... -
java内省机制
2010-11-11 11:10 2401反射 (Reflection):反射就是让你可以通 ... -
Design Pattern: Two-phase Termination 模式
2010-11-10 23:59 1050Two-phase Termination直译的话是“两相终止 ...
相关推荐
Each part discusses a specific to-date topic on new and valuable design ideas in the area of analog circuit design. Each part is presented by six experts in that field and state of the art ...
"Design pattern In JavaScript"这个主题涵盖了一系列广泛使用的模式,这些模式可以分为三大类:创建型、结构型和行为型。 1. **创建型模式**: - **工厂模式**:它提供了一种创建对象的接口,但允许子类决定实例...
FOAD(Fundamentals of Object-Oriented Design)设计模式,是对面向对象设计原则的具体实现,旨在提高代码的可读性、可维护性和可扩展性。在C#编程语言中,这些模式被广泛运用,以优化程序结构,提高代码质量。 1....
ASP.NET 3.5 Website Programming: Problem - Design - Solution Chris Love ISBN: 978-0-470-18758-6 Paperback 648 pages October 2009 * Uses the popular Problem;Design;Solution format to help readers, ...
Networkers2009:BRKCAM-3011 - Advanced Enterprise Campus Design: Leveraging Virtual Switch System
Systems Analysis and Design: An Object-Oriented Approach with UML, 5th Edition by Dennis, Wixom, and Tegarden captures the dynamic aspects of the field by keeping students focused on doing SAD while ...
本文档可以解决win10环境中使用ISE14.7的Simulation仿真时总是出错"ERROR:Simulator:861 – Failed to link the design" 解决方法和解决工具都在本文档里面!下载查看。
这个名为"java-design-pattern"的压缩包很可能是包含了一系列Java实现的设计模式示例代码库。下面,我们将深入探讨Java设计模式的重要性和各种类型。 设计模式是经过多年实践和经验总结出的通用解决方案,它们描述...
在这个项目中,“javascript-design-pattern”显然是一个专注于前端设计模式的学习资源,通过示例(demo)来帮助开发者理解和应用这些模式。 首先,我们要了解设计模式的基本概念。设计模式是经过多次实际开发经验...
在给定的标题“design-pattern-factory-method:Código-exemplopara ilustrar o Padrão de Projeto Factory Method”中,我们关注的是工厂方法(Factory Method)设计模式。这是一种创建型设计模式,它定义了一个...
英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价: ¥35.00 会员价: ¥31.50 币值: 315 ...
"DesignPattern-321: 参考-头先设计模式"这个项目可能是一个关于设计模式的学习资源,其中包含了对策略模式的应用以及对继承与组合的讨论。下面将详细解析这些知识点。 **策略模式**是一种行为设计模式,它使你能在...
"DesignPattern-master_designpattern_powerful854_" 这个压缩包很可能包含了23种经典的设计模式的实现或者相关教程,旨在帮助开发者提升软件设计的灵活性、可维护性和可扩展性。 设计模式分为三大类:创建型模式、...
本资源“DesignPattern::pencil:设计模式_java实现以及详解”提供了一套详细的学习材料,帮助开发者理解和应用设计模式。 该资源的作者是“养码青年-Style”,他通过这个项目记录了自己的设计模式学习过程。鼓励...
信号与系统教学课件:9-5 Design for LTI systems.ppt
信号与系统教学课件:10-3 Design for LTI systems.ppt
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
设计模式:可复用面向对象软件的基础(中文)Design Patterns:Elements of Reusable Object-Oriented software