线程安全
线程安全,就是指一个对象或一串代码,在多个线程下同时被访问或是执行,某个线程所得到的结果,和只有这个线程单独运行所得到的结果一样,就是线程安全的。
线程安全的问题是由全局变量和静态变量引起的。原因是:全局变量和静态变量都是存储在静态存储区,静态存储区是在程序编译时就已经分配好了,于是程序执行出现下面的情况:A线程创建了一个对象,该对象包含静态成员,默认值为5,A线程修改这个值为6。当启动B线程的时候,B线程访问该对象的静态成员的预期值为5,但实际上是6。所以这不是线程安全的。当然,若是程序对全局和静态成员只有读操作,该对象自然是线程安全的;若是有写操作,就需要考虑线程同步的问题了。
WCF的PerCall、PerSession、Signle
PerCall:当客户端调用每调用一次服务时,服务端的服务实例就被创建一次。
PerSssion:当客户端第一次调用服务时,服务端的服务实例就被创建一次,接下来的服务调用,都不会引起服务实例的创建。
Signle:这个就相当于设计模式中的单件模式。
WCF的通道和分发器
这两个概念要通过WCF的体系结构去理解。
通道:
要调用WCF的服务,需要在客户端生成相应的代理。代理调用服务和服务端进行交互依赖于WCF的拦截机制。当代理调用栈帧时,就将栈帧序列化到消息中,消息就通过通道链开始向下传递时,WCF开始执行拦截。通道就相当于一个拦截器。通道链上,不同阶段的通道节点具备不同的功能:比如序列化,编码,加密,传输等功能。
这里要解释一下栈帧的概念:
栈的作用:函数调用、保存函数的返回地址、形参、函数内的局部变量。
栈帧:为单个过程分配的那部分栈称为栈帧。就是:为调用某个函数所分配的栈即为栈帧。在WCF中可以理解为:代理所调用的那个方法。
分发器:
观察WCF的体系结构发现,客户端通过传输通道把消息传出之后,并没有和服务端保持联系,具体去调用某个服务其实是服务分发器管控的。按照WCF服务编程上面的说法,这个分发器就是服务端的本地客户端。分发器是如何寻找到客户端要调用的服务呢,就是通过消息信封中,就是SOAP文档中的内容,根据里面的ABC和栈帧(其实就是服务名称)在服务端找到对应的服务,然后进行调用。