- 浏览: 1500909 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (798)
- struts2 (42)
- servlet (20)
- quartz (4)
- jquery & ajax (24)
- tomcat (5)
- javascript (15)
- struts1 (8)
- 搜索关键字及链接 (3)
- fckeditor (3)
- Apache (5)
- spring (22)
- linux (3)
- 企业应用 (8)
- 综合应用 (13)
- 服务器 (2)
- 数据库 (85)
- 性能调优 (21)
- 网络应用 (15)
- 缓存技术 (8)
- 设计模式 (39)
- 面试题 (7)
- 程序人生&前辈程序员 (29)
- java基础 (59)
- hibernate (75)
- log4j (4)
- http (11)
- 架构设计 (28)
- 网页设计 (12)
- java邮件 (4)
- 相关工具 (11)
- ognl (7)
- 工作笔记 (18)
- 知识面扩展 (12)
- oracle异常 (1)
- 正则表达式 (2)
- java异常 (5)
- 项目实践&管理 (1)
- 专业术语 (11)
- 网站参考 (1)
- 论坛话题 (2)
- web应用 (11)
- cxf&webservice (22)
- freemarker (3)
- 开源项目 (9)
- eos (1)
- ibatis (6)
- 自定义标签 (3)
- jsp (3)
- 内部非公开文档(注意:保存为草稿) (0)
- 国内外知名企业 (2)
- 网店 (3)
- 分页 (1)
- 消费者习惯 (2)
- 每日关注 (1)
- 商业信息 (18)
- 关注商业网站 (1)
- 生活常识 (3)
- 新闻 (2)
- xml&JSON (5)
- solaris (1)
- apache.common (3)
- BLOB/CLOB (1)
- lucene (2)
- JMS (14)
- 社会进程 (8)
- SSH扩展 (2)
- 消费心理 (1)
- 珠三角 (1)
- 设计文档 (1)
- XWork&webwork (1)
- 软件工程 (3)
- 数据库及链接 (1)
- RMI (2)
- 国内外知名企业&人物 (1)
最新评论
-
司c马:
简介易懂、
OutputStream和InputStream的区别 -
在世界的中心呼喚愛:
解决我的问题
Java获取客户端的真实IP地址 -
bo_hai:
都是些基本的概念呀!
SSO -
tian_4238:
哥们,你也是搞水利这块的吧。
巧用SQLQuery中的addScalar -
loveEVERYday:
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp小结
通常在多线程中,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本
实现线程本地类其实不难:以当前线程为key,要保存的对象为value
public class ThreadLocalSample {
private Map map = Collections.synchronizedMap(new HashMap());
public void set(Object value) {
map.put(Thread.currentThread(), value);
}
public Object get() {
Object value = map.get(Thread.currentThread());
return value;
}
}
ThreadLocal可用在Servlet的过滤器中,比如:每一个请求都由一个Connection来操作数据库,由于Servlet只有一个实例,所以应该是每个线程用一个连接,而不是所有线程用一个Connection,因此需要用到ThreadLocal类;由于Servlet是在Filter链的调用中点执行,即Filter1->Filter2->...->Servlet->Filter2->Filter1,因此:可以用一个Filter,在这个Filter调用下一个Filter前初始化连接,并将其放入ThreadLocal中,在调用又回到这个Filter时,得到连接并关闭。
代码如下:
public class TransactionManageFilter implements Filter {
private FilterConfig config;
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
public void destroy() {
config = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Connection conn = ConnectionManager.currentConnection();
try {
conn.setAutoCommit(false);
chain.doFilter(request, response, chain);
conn.commit();
} catch (Exception e) {
conn.rollback();
} finally {
try {
conn.setAutoCommit(true);
conn.close();
ConnectionManager.removeConnection();
} catch (Exception e) {}
}
}
}
public class ConnectionManager {
private static ThreadLocal currConn = new ThreadLocal();
public static Connection currentConnection() {
Object obj = currConn.get();
if (obj != null) {
return (Connection)obj;
} else {
Connection conn = ConnectionFactory.getConnection();
currConn.set(conn);
return conn;
}
}
public static void removeConnection() {
Object obj = currConn.get();
if (obj != null) {
currConn.set(null);
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/teedry/archive/2010/01/11/5177709.aspx
发表评论
-
ISO-8859_1统一编码 java
2011-08-19 11:07 2030Java中文问题一直困扰着很多初学者,如果了解了Java系统的 ... -
UTF-8 GBK UTF8 GB2312
2011-08-19 10:46 1925UTF-8:Unicode TransformationFor ... -
Properties 类读取配置文件
2011-08-17 22:37 14621、使用java.util.Properties类的load( ... -
Java编程之四大名著
2011-08-06 10:07 1460中文第四版 http://download.csdn.n ... -
JDK5.0 新特性
2011-07-28 20:02 13871.AutoBoxing 原来int是非 ... -
JDK6的新特性
2011-07-28 19:57 1784JDK6的新特性 JDK6的新特性之一_Desktop类和Sy ... -
线程同步
2011-07-25 11:34 1278作者 : buaawhl http://www.iteye.c ... -
ZipInputStream类
2011-07-22 11:33 18770《Java开发实战经典》第12章Java IO,Java ... -
String、StringBuffer和StringBuilder的区别
2011-07-14 15:04 1368String是不可变的,StringBuffer是可变的;St ... -
精通JAVA核心技术
2011-07-11 11:31 1285http://www.2cto.com/ebook/20100 ... -
Java多线程sleep(),join(),interrupt(),wait(),notify()
2011-07-06 22:51 4908浅析 Java Thread.join() 一、在研究j ... -
FileInputStream/FileOutputStream的应用
2011-07-06 15:06 1408这是一对继承于InputStream和OutputStream ... -
Java基础之理解JNI原理
2011-07-05 14:55 1312JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA ... -
面向对象和面向过程的区别
2011-07-04 09:52 1411面向过程就是分析出解 ... -
Java参数传值还是传引用
2011-07-03 20:52 3637参数是按值而不是按 ... -
JAVA排序汇总
2011-06-29 18:07 1484package com.softeem.jbs.lesson4 ... -
Java流操作,InputStream、OutputStream及子类FileInputStream、FileOutputStream;BufferedInpu
2011-06-27 18:09 19254Java将数据于目的地及来 ... -
线程综合文章
2011-06-27 10:48 1116http://lavasoft.blog.51cto.com/ ... -
由Java中的Set,List,Map引出的排序技巧
2011-06-24 14:18 2376一。关于概念: ... -
Date、String、Timestamp之间的转换
2011-03-20 16:59 2419public static Timestamp pars ...
相关推荐
#### 二、API 解释 ##### ThreadLocal() **用途**:创建一个新的 ThreadLocal 实例。 **示例代码**: ```java ThreadLocal<String> threadLocal = new ThreadLocal(); ``` ##### T get() **用途**:返回当前...
在Java中,ThreadLocal可以通过ThreadLocal类的实例来实现线程间隔离的变量访问。例如,在示例代码中,我们使用了ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null);来定义一个ThreadLocal变量...
以下是对Java内部类的详细解释: 一、内部类的分类: 1. 成员内部类:在类的外部定义,与类的成员变量和方法处于同一层次,可以访问外部类的所有成员,包括私有成员。 2. 局部内部类:在方法或作用域内定义的类,...
在这个例子中,我们可以发现有一个UserContext的静态类,它使用ThreadLocal来保存用户的登录信息。这个类提供了get和clear方法来获取和清理用户的登录信息。 在拦截器中,我们可以发现调用了UserContext.set方法来...
如果发现`ThreadLocal`绑定的`Dao`类占用了大量内存,则需要进一步检查此类是否合理使用了`ThreadLocal`机制。通常情况下,不当使用`ThreadLocal`会导致每个线程保留大量不必要的数据,从而增加内存负担。 ##### 2....
2. **第二章:类与对象** 类是面向对象编程的基础,是描述对象的模板。而对象是类的实例,包含数据(成员变量)和行为(方法)。这一章将深入讲解如何定义类,创建对象,以及理解封装、继承和多态等面向对象的核心...
1. **线程局部变量ThreadLocal**:讲解ThreadLocal类的用途及其如何帮助减少内存开销并简化代码编写。 2. **不可变对象**:解释为什么使用不可变对象可以提高并发程序的性能,并给出如何创建不可变对象的建议。 3....
面试者需要掌握线程创建的方式、线程同步机制(synchronized关键字、ReentrantLock等)、volatile关键字的作用以及ThreadLocal类的用途。 #### 二、高级特性与应用 1. **反射机制** - 反射是Java提供的一种能在...
- 算法:排序(冒泡、选择、插入、快速、归并、堆排序等)、查找(顺序、二分、哈希查找)、递归、动态规划、贪心算法、回溯法等。 2. **设计模式**: - 创建型:单例、工厂、抽象工厂、建造者、原型模式。 - ...
2. 注释:注释应简洁明了,解释代码逻辑,而不是代码本身的内容。类、方法、变量上方应有Javadoc注释。 3. 类与接口:类名使用全大写字母单词组合,接口名推荐以"I"开头,如`IUserService`。 二、异常处理 1. 异常...
Java多线程是面试中的热点,会考察synchronized关键字、volatile、ThreadLocal、线程池(ExecutorService)等。面试官可能让你解释并发编程中的死锁、活锁、饥饿状态等概念,并要求设计线程安全的代码。 五、IO/NIO...
│ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致问题的引入.mp4 │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速...
│ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致问题的引入.mp4 │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速...
3. **多线程**:涵盖线程的创建、同步、通信,以及ThreadLocal和并发工具类的使用。 4. **网络编程**:介绍套接字(Socket)编程,以及服务器端和客户端的实现。 5. **反射机制**:讲解如何在运行时动态获取类的...
实验二:类与对象 此实验旨在教授面向对象编程的基础,包括: 1. 定义类,理解类的属性(fields)和方法(methods)。 2. 创建和使用对象,理解对象的实例化过程。 3. 学习访问修饰符(public, private, protected, ...
本资源包中的Markdown文档将详细解释上述概念,并通过实际代码案例进行演示,帮助读者更好地理解和应用多线程技术。代码示例可能包括线程创建、同步机制的应用、线程通信的实现以及线程池的使用等,读者可以通过运行...
2. 注释规范:提供清晰的函数和类注释,用Javadoc格式,对于复杂的逻辑或重要的代码段要进行详细解释。 3. 类与接口:合理设计类和接口,避免过多的抽象类,优先考虑接口实现多态。 二、异常处理 1. 异常捕获:避免...