线程 continue -- 2

原创 2004年07月13日 11:56:00

清单 2. ThreadLocal 的糟糕实现

public class ThreadLocal {
  private Map values = Collections.synchronizedMap(new HashMap());

  public Object get() {
    Thread curThread = Thread.currentThread();
    Object o = values.get(curThread);
    if (o == null && !values.containsKey(curThread)) {
      o = initialValue();
      values.put(curThread, o);
    }
    return o;
  }

  public void set(Object newValue) {
    values.put(Thread.currentThread(), newValue);
  }

  public Object initialValue() {
    return null;
  }
}

 

这个实现的性能不会很好,因为每个 get() 和 set() 操作都需要 values 映射表上的同步,而且如果多个线程同时访问同一个 ThreadLocal,那么将发生争用。此外,这个实现也是不切实际的,因为用 Thread 对象做 values 映射表中的关键字将导致无法在线程退出后对 Thread 进行垃圾回收,而且也无法对死线程的 ThreadLocal 的特定于线程的值进行垃圾回收。

用 ThreadLocal 实现每线程 Singleton
线程局部变量常被用来描绘有状态“单子”(Singleton) 或线程安全的共享对象,或者是通过把不安全的整个变量封装进 ThreadLocal,或者是通过把对象的特定于线程的状态封装进 ThreadLocal。例如,在与数据库有紧密联系的应用程序中,程序的很多方法可能都需要访问数据库。在系统的每个方法中都包含一个 Connection 作为参数是不方便的 — 用“单子”来访问连接可能是一个虽然更粗糙,但却方便得多的技术。然而,多个线程不能安全地共享一个 JDBC Connection。如清单 3 所示,通过使用“单子”中的 ThreadLocal,我们就能让我们的程序中的任何类容易地获取每线程 Connection 的一个引用。这样,我们可以认为 ThreadLocal 允许我们创建每线程单子。

清单 3. 把一个 JDBC 连接存储到一个每线程 Singleton 中
public class ConnectionDispenser {
  private static class ThreadLocalConnection extends ThreadLocal {
    public Object initialValue() {
      return DriverManager.getConnection(ConfigurationSingleton.getDbUrl());
    }
  }

  private ThreadLocalConnection conn = new ThreadLocalConnection();

  public static Connection getConnection() {
    return (Connection) conn.get();
  }
}

 


任何创建的花费比使用的花费相对昂贵些的有状态或非线程安全的对象,例如 JDBC Connection 或正则表达式匹配器,都是可以使用每线程单子(singleton)技术的好地方。当然,在类似这样的地方,您可以使用其它技术,例如用池,来安全地管理共享访问。然而,从可伸缩性角度看,即使是用池也存在一些潜在缺陷。因为池实现必须使用同步,以维护池数据结构的完整性,如果所有线程使用同一个池,那么在有很多线程频繁地对池进行访问的系统中,程序性能将因争用而降低。

用 ThreadLocal 简化调试日志纪录
其它适合使用 ThreadLocal 但用池却不能成为很好的替代技术的应用程序包括存储或累积每线程上下文信息以备稍后检索之用这样的应用程序。例如,假设您想创建一个用于管理多线程应用程序调试信息的工具。您可以用如清单 4 所示的 DebugLogger 类作为线程局部容器来累积调试信息。在一个工作单元的开头,您清空容器,而当一个错误出现时,您查询该容器以检索这个工作单元迄今为止生成的所有调试信息。


 

java关键字之break与continue的区别(简单明了的小例子)

一.作用与区别 break的作用是跳出当前循环块(for、while、do while)或程序块(switch)。在循环块中的作用是跳出当前正在循环的循环体。在程序块中的作用是中断和下一个case条...
  • tomcat_2014
  • tomcat_2014
  • 2015年10月19日 19:48
  • 1278

【iOS】Unlock iPhone to Continue Xcode cannot launch demo1_greating on iPhone because the device is lo

错误信息为: Unlock iPhone to Continue Xcode cannot launch demo1_greating on iPhone because the device...
  • liuchuo
  • liuchuo
  • 2016年09月16日 12:38
  • 550

Python continue 语句

Python continue 语句Python continue 语句跳出本次循环,而break跳出整个循环。continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环...
  • u011225629
  • u011225629
  • 2015年12月05日 11:06
  • 1636

python 中的循环

while循环                                                                            while i 循环体 i+=1 ...
  • ainizhongguoaa
  • ainizhongguoaa
  • 2016年10月19日 00:33
  • 404

is busy: Processing symbol files Xcode will continue when “iPhone

很简单,说明手机和电脑还没识别号,只需等待就可以了或者拔掉线,重新认证就可以了...
  • baidu_31683691
  • baidu_31683691
  • 2016年09月02日 17:45
  • 4254

线程 continue -- 3

清单 4. 用 ThreadLocal 管理每线程调试日志public class DebugLogger {  private static class ThreadLocalList extend...
  • wensilan
  • wensilan
  • 2004年07月13日 11:59
  • 692

线程 continue -- 4

ThreadLocal 的性能虽然线程局部变量早已赫赫有名并被包括 Posix pthreads 规范在内的很多线程框架支持,但最初的 Java 线程设计中却省略了它,只是在 Java 平台的版本 1...
  • wensilan
  • wensilan
  • 2004年07月13日 12:01
  • 896

lua 中continue的实现

今天写项目的时候要用到c++中的continue,但是lua中并没有continue所以只能自己实现一下 for i=1,10 do while true do ...
  • qq_30392565
  • qq_30392565
  • 2016年11月30日 16:20
  • 7892

while中的continue和if中的continue的区别

#include int main() { int n; for(n=100;n
  • n8765
  • n8765
  • 2015年04月29日 11:35
  • 1349

Google面试题—有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD

有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:A:1 2 3 4 1 2....B:...
  • lilien1010
  • lilien1010
  • 2012年10月27日 19:56
  • 7604
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程 continue -- 2
举报原因:
原因补充:

(最多只允许输入30个字)