线程 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
  • 1234

if continue在循环遍历中的使用

if     continue : 表示当前当前循环,如果if条件满足, 就结束循环,接着下一个循环, 知道循环结束。    过滤银行渠道:最后根据渠道类型过滤掉合并渠道。 private sta...
  • wanghang88
  • wanghang88
  • 2016年08月23日 14:17
  • 3458

for循环里面break和continue的区别

很多初学Java的同学可能对break和continue跳出for循环有些疑惑, 其实简单的说就是:在多层嵌套for循环里面break是跳出包裹continue这一层for循环的所有循环,跳出之后不...
  • freeFish_zwy
  • freeFish_zwy
  • 2017年07月30日 16:02
  • 383

浅谈break 、continue、return,goto四种语句的区别。

3.浅谈break 、continue、return三种语句的区别: break,continue,return这三个具有跳转功能的语句在c语言中经常被用到,近期身边有些小伙伴总是把它们的用法搞乱,在...
  • wanghy_ios
  • wanghy_ios
  • 2015年07月19日 22:11
  • 1465

再探java基础——break和continue的用法

再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中。 用于switch...case中: 执行完满足case条件的...
  • luoweifu
  • luoweifu
  • 2013年08月31日 19:09
  • 34094

java基础之continue语句的使用

在前面文章中上海java培训机构介绍了break语句的使用,在if循环中使用break语句退出循环。但是可能你也会遇到这样的问题,在某次循环中,我们不想执行完所有的循环体,就想跳出本次循环开始执行下一...
  • u014744764
  • u014744764
  • 2014年10月31日 15:23
  • 1076

int 0x13 中断理解

int 0x13中断向量所指向的中断服务程序实质上就是磁盘服务程序。 用途:将指定扇区的代码加载到内存的指定位置。 因此,在使用int 0x13中断时要将参数传递给服务程序: 例如:将指...
  • u013590407
  • u013590407
  • 2016年08月24日 15:00
  • 504

Java线程池,线程中断

在java中的线程池可以更加灵活的控制线程的生命周期,而且可以复用处于空闲状态的线程,更加省资源 其他的就不介绍了,介绍下: - newSingleThreadExecutor;这是一个...
  • lhd201006
  • lhd201006
  • 2016年01月23日 13:15
  • 1445

c语言:break和continue的区别,编程举例说明

break和continue的区别:   以一个for(i=1;i注意:break语句只能用于循环语句和switch语句中,不能单独使用。例:输出以下4*5的矩阵。输出矩阵:1       2    ...
  • yanxiaolx
  • yanxiaolx
  • 2016年05月29日 13:39
  • 2359

深入分析Java线程中断机制

在平时的开发过程中,相信都会使用到多线程,在使用多线程时,相信大家也会遇到各种各样的问题,今天我们就来说说一个多线程的问题——线程中断。在java中启动线程非常容易,大多数情况下我是让一个线程执行完自...
  • yuanzeyao2008
  • yuanzeyao2008
  • 2015年08月01日 15:04
  • 3752
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程 continue -- 2
举报原因:
原因补充:

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