线程模型：谁该关心？

当一个访问者连上你的站点，他事实上真正地注册成为一个用户（通常命名为IUSR_MACHINE，在这里MACHINE是你的计算机的名称）。这提出了一个新挑战：如果在同一时间有许多访问者作相同一件事（作为同一用户），你的软件将不能设定事件发生的顺序）。例如，你不能编写一个用于更新从数据库中最近一次读取记录的组件，如果两个人同时访问这个数据库，那么你的组件将假定将要被更新的记录是上次所读的，错误就会发生！

作为一个组件开发者，你的责任是理解线程模型以及它怎样影响你的应用程序，你将会看到：Visual Basic的线程同Java的不一样。

Microsoft的组件对象模型引入了线程安全性这个概念。在以前，每个人都用同时只有一人使用的单用户Windows工作站，Windows NT和Internet改变了这一切。Web服务器可以同时处理多个请求，并且为了得到最优化的服务器效率，代码和数据连接是以池的形式出现。这意味着Web请求可能执行代码的一部分，然后Web请求可能请求相同的代码做别的事。代码不用考虑谁请求操作这种模型叫做自由线程。

不是所有的对象都是自由线程结构的。例如，Visual Basic和Microsoft Access就不是这样，VB5使用套间模型（见表28.1），而Access使用的是一种高效率的单线程结构。你必须根据其线程模型来确定如何使用一个组件，但是真正的“不安全”对象可以通过与Microsoft Transactions Server包相绑定来为其提更高级别的隔离，从而实现线程安全性。

表28.1 线程模型

模型 | 描述
单一线程 | 设计成单用户应用程序，所有的过程以线性方式处理，不要将其用于Web应用中。
套间线程 | 可以作为一个多用户使用组件，但在同一时间只能有单一线程，不要将其作为系统端对象使用（例如，用于应用程序级），因为那样会形成“瓶颈”。VB使用这种模型。
自由线程 | 作为一个多重使用组件，同一时间允许多个线程运行。J++和C++可以创建这种组件，但编程者需要对线程安全性有根本的了解。
所有 | 既可以以自由线程也可以以套间线程来操作，这是最理想的。缺省条件下，Java在Microsoft 环境下使用这种模型。

这章的剩余部分将通过三个“烹调书籍”的例子来介绍如何建立一个组件，在这些例子里假定你已经安装了Visual Basic5或Java编辑器，并且你知道如何在集成开发环境（IDE）中如何操作。

首先我们转向Java，它比VB复杂的多，同时它功能也更强大。它与C相似，处于Windows API函数更低一级位置。

接下来的两个例子使用VB，它是创建任何对象最简单的途径，但是我们第二个VB　例子将涉及到Windows API函数，以介绍一些高级概念。

技巧

Microsoft将Visual Basic,Visual C++,Visual J++ 等捆绑在一起，以Visual Studio97　的形式出现，这是在单一软件里获得多种开发环境的最值得的途径。

我们的前两个例子将用两种语言来建立相同功能的组件。组件本身并不如典型的产品组件复杂。主要有以下两个原因：

■产品组件需要额外的错误处理代码，而例子中不需要。

■一个真正的强壮的例子阅读起来很困难，因为代码复杂性将阻碍我们的学习。

此组件将一个州的缩写作为输入，返回所有州中的滑翔机俱乐部，以表格形式输出。这难道就不能用VBScript而不通过编写一个组件来实现吗？当然是可以的，但编写组件的优点就在于我们的代码是编译过的，从而达到保持你知识产权的目的。

因为这个组件作为一个会话级对象（每个用户一个局柄），套间线程是比较适用的，Visual Basic和Java都可以创建套间模型对象，所以两种工具都适用。