并发中的同步--WCF并发体系的同步机制实现

在《WCF 并发的本质》中,我们谈到了WCF提供的三种不同的并发模式,使开发者可以根据具体的情况 选择不同的并发处理的策略。对于这三种并发模式,Multiple采用的并行的执行方式,而Single和 Reentrant则是采用串行的执行方式。串行执行即同步执行,在WCF并发框架体系中,这样的同步机制是如 何实现的呢?

一、Concurrency.Single模式下的同步实现

实际上,WCF并发框架体系下针对Concurrency.Single模式的实现非常简单,其本质就是对 InstanceContext进行加锁。如果采用反编译工具查看InstanceContext的定义,你会发现 InstanceContext类中定义了一个类型为System.Object名为ThisLock的内部属性,而该属性实际上就是对 基类CommunicationObject同名属性的引用,相关代码入下所示。WCF就是通过对InstanceContext的 ThisLock进行加锁,确保了对InstanceContext的同步访问。

1: public sealed class InstanceContext : CommunicationObject,  IExtensibleObject<InstanceContext>
2: {
3:   //其它成员
4:   internal  object ThisLock
5:   {
6:     get
7:     {
8:        return base.ThisLock;
9:     }
10:   }
11: }
12: public abstract  class CommunicationObject : ICommunicationObject
13: {
14:   //其它成员
15:    protected object ThisLock { get; }
16: }

具体来讲,WCF服务端运行时在处理服务调用消息请求之后,利用实例上下文提供者 (InstanceContextProvider)创建新的或者获取现有的InstanceContext。然后,WCF会将请求消息分发 给该InstanceContext对消息进行进一步处理。在处理操作执行之前,如果发现相应的服务采用的并发模 式是ConcurrencyMode.Single,WCF运行时会试图获取InstanceContext的ThisLock上的锁,或者说后续的 操作进行再对InstanceContext的ThisLock锁定的情况下执行的。这样就保证了单一的InstanceContext对 象在ConcurrencyMode.Single并发模式下永远是以同步的方式被调用的。

时间: 2024-08-03 11:36:58

并发中的同步--WCF并发体系的同步机制实现的相关文章

WCF并发(Concurrency)的本质:同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求

引言 服务(Service)的本质就是提供服务消费者期望的某种功能,服务的价值体现在两个方面:服务本身的质量和寄宿服务的平台应付消费者的数量,并发(Concurrency)的关注的是第二个要素.WCF服务寄宿于资源有限的环境中,要实现服务效用的最大化,需要考虑如何利用现有的资源实现最大的吞吐量(Throughput).提高吞吐量就某个寄宿的服务实例(Service Instance)来说,一个重要的途径就是让它能够同时处理来自各个客户端(服务代理)的并发访问.WCF实现了一套完整的并发控制体系,

同步-线程并发中wait()和notify()怎么用的,可不可以举个小例子

问题描述 线程并发中wait()和notify()怎么用的,可不可以举个小例子 线程并发中wait()和notify()怎么用的,可不可以举个小例子,再问一下,线程中阻塞方法有哪些,同步的有哪些? 解决方案 参考:http://longdick.iteye.com/blog/453615

WCF并发(Concurrency)的本质

---同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求 引言 服务(Service)的本质就是提供服务消费者期望的某种功能,服务的价值体现在两个方面:服务本身的质量和寄宿服务的平台应付消 费者的数量,并发(Concurrency)的关注的是第二个要素.WCF服务寄宿于资源有限的环境中,要实现服务效用的最大化,需要考虑如何 利用现有的资源实现最大的吞吐量(Throughput).提高吞吐量就某个寄宿的服务实例(Service Instance)来说,一个重要的途径就是

[原创]WCF后续之旅(12): 线程关联性(Thread Affinity)对WCF并发访问的影响

在本系列的上一篇文章中,我们重点讨论了线程关联性对service和callback的操作执行的影响:在service host的时候,可以设置当前线程的SynchronizationContext,那么在默认情况下,service操作的执行将在该SynchronizationContext下执行(也就将service操作包装成delegate传入SynchronizationContext的Send或者Post方法):同理,对于Duplex同行方式来讲,在client调用service之前,如果

线程同步方法和差别~(高并发中多个线程访问统一资源域,容易出现线程安全性)

同步就是指一个线程要等待上一个线程执行完之后才开始执行当前的线程: 异步是指一个线程去执行,它的下一个线程不必等待它执行完就开始执行. 同步优势:java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突, 因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从而保证了该变量的唯一性和准确性(保证线程安全). 以下为java中实现线程同步方法和差别: 1:银行取款[多线程]{未进行线程同步}(junit不适合多线程

Java中Clojure如何抽象并发性和共享状态

在所有 Java 下一代语言中,Clojure 拥有最激进的并发性机制和功能.Groovy 和 http://www.aliyun.com/zixun/aggregation/16945.html">Scala 都为并发性提供了改善的抽象和语法糖的一种组合,而 Clojure 坚持了它始终在 JVM 上提供独一无二的行为的强硬立场.在本期 Java 下一代 中,我将介绍 Clojure 中众多并发性选项的一部分.首先是为 Clojure 中易变的引用提供支撑的基础抽象:epochal 时间

Java线程并发中常见的锁--自旋锁 偏向锁

  随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制.     1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想是,如果程序没有竞争,则取消之前已经取得锁的线程同步操作.也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,就无需再进行相关的同步操作了,从而节约了操作时间,如果在此之间有其他的线程进行了锁请求,则锁退出偏向模式.在JVM中使用-XX:+UseBiasedLocki

基本线程同步(四)在同步代码中使用条件

在同步代码中使用条件 在并发编程中的一个经典问题是生产者与消费者问题,我们有一个数据缓冲区,一个或多个数据的生产者在缓冲区存储数据,而一个或多个数据的消费者,把数据从缓冲区取出. 由于缓冲区是一个共享的数据结构,我们必须采用同步机制,比如synchronized关键字来控制对它的访问.但是我们有更多的限制因素,如果缓冲区是满的,生产者不能存储数据,如果缓冲区是空的,消费者不能取出数据. 对于这些类型的情况,Java在Object对象中提供wait(),notify(),和notifyAll()

Java并发编程系列之一:并发机制的底层原理

前言 并发编程的目的是让程序运行更快,但是使用并发并不定会使得程序运行更快,只有当程序的并发数量达到一定的量级的时候才能体现并发编程的优势.所以谈并发编程在高并发量的时候才有意义.虽然目前还没有开发过高并发量的程序,但是学习并发是为了更好理解一些分布式架构.那么当程序的并发量不高,比如是单线程的程序,单线程的执行效率反而比多线程更高.这又是为什么呢?熟悉操作系统的应该知道,CPU是通过给每个线程分配时间片的方式实现多线程的.这样,当CPU从一个任务切换到另一个任务的时候,会保存上一个任务的状态,