首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

关于ThreadLocal方式的体会

2012-10-09 
关于ThreadLocal模式的体会写这篇帖子的目的不是为了来剖析ThreadLocal,因为坛子里有许多高手已经深入浅出

关于ThreadLocal模式的体会

写这篇帖子的目的不是为了来剖析ThreadLocal,因为坛子里有许多高手已经深入浅出的把ThreadLocal讲解的很清楚了。

特别是lujh99的正确理解ThreadLocal这篇帖子,通过JDK源代码把ThreadLocal讲得非常深入浅出,让我深受启发。我写这篇帖子的目的只是为再此作一个补充,想以另外一种通俗易懂的表达方式把自己对ThreadLocal理解写出来。

?

?

doFilter(){设置threadlocal变量;filterChain.doFilter();清除threadlocal变量;}


这样就保证了在Action、JSP里都可以获得本线程的threadlocal变量。
注意:一次web 请求肯定是由一个线程来完成响应的。doFilter(){设置threadlocal变量;filterChain.doFilter();清除threadlocal变量;}


这样就保证了在Action、JSP里都可以获得本线程的threadlocal变量。
注意:一次web 请求肯定是由一个线程来完成响应的。
这样的用法就更清析了...
不知道还有可能会出什么问题.....
不想用了新的用法会出什么隐问题public class Foo {static SimpleDateFormat formator = new SimpleDateFormat("yyMMddHHmmss");public static String format(Date date) {return formator.format(date);}}

那么为了避免并发的错误,可以有如下2中方案,1加synchronized,这样每次只有一个线程访问这个方法,对性能有影响
public static synchronized String format(Date date) {return formator.format(date);}

2,每次调用这个方法就生成一个新的SimpleDateFormat对象,这样会生成大量的对象,对性能不是很好
public static String format(Date date) {SimpleDateFormat formator = new SimpleDateFormat("yyMMddHHmmss");return formator.format(date);}


那么如果用ThreadLocal就可以解决创建大量对象的问题和并发访问的问题,重复利用SimpleDateFormat对象
public class Foo {static ThreadLocal local = new ThreadLocal();public static String format(Date date) {SimpleDateFormat formator = (SimpleDateFormat)local.get();if (formator == null) {formator = new SimpleDateFormat("yyMMddHHmmss");local.set(formator);}return formator.format(date);}}


public class Foo {static SimpleDateFormat formator = new SimpleDateFormat("yyMMddHHmmss");public static String format(Date date) {return formator.format(date);}}

那么为了避免并发的错误,可以有如下2中方案,1加synchronized,这样每次只有一个线程访问这个方法,对性能有影响
public static synchronized String format(Date date) {return formator.format(date);}

2,每次调用这个方法就生成一个新的SimpleDateFormat对象,这样会生成大量的对象,对性能不是很好
public static String format(Date date) {SimpleDateFormat formator = new SimpleDateFormat("yyMMddHHmmss");return formator.format(date);}


那么如果用ThreadLocal就可以解决创建大量对象的问题和并发访问的问题,重复利用SimpleDateFormat对象
public class Foo {static ThreadLocal local = new ThreadLocal();public static String format(Date date) {SimpleDateFormat formator = (SimpleDateFormat)local.get();if (formator == null) {formator = new SimpleDateFormat("yyMMddHHmmss");local.set(formator);}return formator.format(date);}}



这个我赞同 doFilter(){设置threadlocal变量;filterChain.doFilter();清除threadlocal变量;}


这样就保证了在Action、JSP里都可以获得本线程的threadlocal变量。
注意:一次web 请求肯定是由一个线程来完成响应的。
这样的用法就更清析了...
不知道还有可能会出什么问题.....
不想用了新的用法会出什么隐问题
这样用就没问题了
doFilter(){设置threadlocal变量;try {filterChain.doFilter();}finally {清除threadlocal变量;}}
private static synchronized int nextHashCode() { int h = nextHashCode; nextHashCode = h + HASH_INCREMENT; return h; }

热点排行