说明resume和proceedresume next语句之间的区别

下面的表格列展了.NET对协调或同步線程动作的可用的工具:

确保只有一个线程访问某个资源或某段代码

确保只有一个线程访问某个资源或某段代码。
可被用于防止一个程序的多个实例同时运行

确保不超过指定数目的线程访问某个资源或某段代码。

(同步的情况下也提够自动锁)

允许线程等待直到它受箌了另一个线程发出信号。

允许一个线程等待直到自定义阻止条件得到满足

完成简单的非阻止原子操作。

允许安全的非阻止在锁之外使鼡个别字段

* 代表页面将转到第四部分

当一个线程通过上面所列的方式处于等待或暂停的状态,被称为被阻止 一旦被阻止,线程立刻放棄它被分配的CPU时间将 它的ThreadState 属性添加为WaitSleepJoin 状态,不在安排时间直到停止阻 止停止阻止在任意四种情况下发生(关掉电脑的电源可不算!):

  • 操作超时(如果timeout被指定了)
  • 通过 framework类型实例相比于并发的只读访问,是线程安全的责任在开放人员实现线程安全代表性地使用互斥锁。

    叧一个方式欺骗是通过最小化共享数据来最小化线程交互这是一个很好的途径,被暗中地用于“弱状态”的中间层程序和web服务器自多個客户端请求 同时到达,每个请求来自它自己的线程(效力于 Framework类型

    锁定可被用于将非线程安全的代码转换成线程安全的代码好的例子是茬.NET framework方面,几乎所有非初始类型的实例都不是线程安全的而如果所有的访问给定的对象都通过锁进行了保护的话,他们可以被用于多线程玳码中 看这个例子,两个线程同时为相同的List 增加条目然后枚举它:

     
     
     的集合也不是线程安全的,在枚举的时候另一个线程改动list的话会拋出异常。胜于直接锁定枚举过程在这个例子中,我们首先将项目 复制到数组当中这就避免了固定住锁因为我们在枚举过程中有潜在嘚耗时。
     
     
    这里的一个有趣的假设:想象如果List 实际上为线程安全的如何解决呢?代码会很少!举例说明我们说我们要增加一个 项目到我們假象的线程安全的list里,如下: (! framework一个普遍模式——静态成员是线程安全的而一个实例成员则不是。从这个模式也能在写自定义类型时得箌一些体会不要创建一个不能线程安 全的难题!
    当写公用组件的时候,好的习惯是不要忘记了线程安全这意味着要单独小心处理那些茬其中或公共的静态成员。
     
    一个被阻止的线程可以通过两种方式被提前释放:

      这三个类都依赖于WaitHandle 类尽管从功能上讲, 它们相当的不同泹它们做的事情都有一个共同点,那就是被“点名”,这允许它们绕过操作系统进程工作而不是只能在当前进程里绕过线程。

      EventWaitHandle 有两个孓类:AutoResetEvent 和 ManualResetEvent (不涉及到C#中的事件或委托)这两个类都派生自它们的基类:它们仅有的不同是它 们用不同的参数调用基类的构造函数。

      性能方面使用Wait Handles系统开销会花费在较小微秒间,不会在它们使用的上下文中产生什么后果

      AutoResetEvent 就像一个用票通过的旋转门:插入一张票,让正确嘚人通过类名字里的“auto”实际上就 是旋转门自动关闭或“重新安排”后来的人让其通过。一个线程等待或阻止通过在门上调用WaitOne 方法(直箌等到这个 “one”门才开) ,票的插入则由调用Set 方法如果由许多线程调用WaitOne ,在门前 便形成了队列一张票可能来自任意某个线程——换訁之,任何(非阻止)线程要通过AutoResetEvent 对象调用Set 方 法来释放一个被阻止的的线程

      如果Set 调用时没有任何线程处于等待状态,那么句柄保持打开矗到某个线程调用了WaitOne 这个行为避免了在线程起身去旋转门和线程插入票(哦,插入票是非常短的微秒间的事真倒霉,你将必须不确定哋等下去了!)间的竞争但是在没人等的时候重 复地在门上调用Set 方法不会允许在一队人都通过,在他们到达的时候:仅有下一个人可以通过多余的票都被“浪费了"。

      WaitOne 接受一个可选的超时参数——当等待以超时结束时这个方法将返回falseWaitOne 在 等待整段时间里也通知离开当前的哃步内容,为了避免过多的阻止发生

      Reset 方法提供在没有任何等待或阻止的时候关闭旋转门——它应该是开着的。

      AutoResetEvent 可以通过2种方式创建第┅种是通过构造函数:

      如果布尔参数为真,Set 方法在构造后立刻被自动的调用另一个方法是通过它的基类EventWaitHandle :

       
       //等待5秒如果存在竞争——存在程序在
      
       // 进程中的的另一个实例关闭之后
      
       
      

      与手工的锁定相比,你可以进行说明性的锁定用衍生自ContextBoundObject 并标以Synchronization 特 性的类,它告诉CLR自动执行锁操作看这个例子:

       
       

      CLR确保了同一时刻只有一个线程可以执行 safeInstance 中的代码。它创建了一个同步对象来完成工作并在 每次调用safeInstance 的方法和属性时在其周围只能够行锁定。锁的作用域——这里是safeInstance 对 象被称为同步环境 。

      那么它是如何工作的呢?Synchronization 特性的命名空间:System.Runtime.Remoting.Contexts 是 一个线索ContextBoundObject 可以被认為是一个“远程”对象,这意味着所有方法的调用是被监听的让这个监 听称为可能,就像我们的例子AutoLock CLR自动的返回了一个具有相同方法囷属性的AutoLock 对 象的代理对象,它扮演着一个中间者的角色总的来说,监听在每个方法调用时增加了数微秒的时间

      锁在内部以相同的方式運作,你可能期待下面的例子与之前的有一样的结果:

       
       

      (注意我们放入了Console.ReadLine 语句)因为在同一时刻的同一个此类的对象中只有一个线程可鉯执行代 码,三个新线程将保持被阻止在Demo 放中直到Test 方法完成,需要等待ReadLine 来 完成因此我们以与之前的有相同结果而告终,但是只有在按唍Enter 键之后这是一个线程安全的手段,差不多足够能在类中排 除任何有用的多线程!

      此外我们仍未解决之前描述的一个问题:如果AutoLock 是一個集合类,比如说我们仍然需要一个像下面一样的锁, 假设运行在另一个类里:

      同步环境可以扩展到超过一个单独对象的区域默认地,如果一个同步对象被实例化从在另一段代码之内它们拥有共享相同的同步环境(换言之,一个大 锁!)这个行为可以由改变Synchronization 特性的構造器的参数来指定。使用SynchronizationAttribute 类 定义的常量之一:

      相当于不使用同步 特性

      如果从另一个同步对象被实例化则合并已存在的同步环境,否则呮剩下非同步

      如果从另一个同步对象被实例化,则合并已存在的同步环境否则创建一个新的同步环境。

      越大的同步环境越容易管理泹是减少机会对有用的并发。换个有限的角度分离的同步环境会造成死锁,看这个例子:

       

      因为每个Deadlock 的实例在Test 内创建——一个非同步类烸个实例将有它自己的同 步环境,因此有它自己的锁。当它们彼此调用的时候不会花太多时间就会死锁(确切的说是一秒!)。如果Deadlock 囷 Test 是由不同开发团队来写的这个问题特别容易发生。别指望Test 知道如何产生的错误更 别指望他们来解决它了。在死锁显而易见的情况下这与使用明确的锁的方式形成鲜明的对比。

      线程安全方法有时候也被称为可重入式的 因为在它执行的时候可以被抢占部分线路,在另外的线程调用也不会带来坏效果从 某个意义上讲,术语线程安全 和 可重入式的 是同义的或者是贴义的

      不过在自动锁方式上,如果Synchronization 的参數可重入式的 为true的话可重入性会有潜在的问题:

      同步环境的锁在执行离开上下文时被临时地释放。在之前的例子里这将能预防死锁的發生;很明显很需要这样的功能。然而一个副作用是在这期间,任何 线程都可以自由的调用在目标对象(“重进入”的同步上下文)的仩任何方法而非常复杂的多线程中试图避免不释放资源是排在首位的。这就是可重 入性 的问题

      因为[Synchronization(true)] 作用于类级别,这特性打开了对于非上下文的方法访问由于可重入性 问题使它们混入类的调用。

      虽然可重入性是危险的但有些时候它是不错的选择。比如:设想一个在其内部实现多线程同步的类将逻辑工作线程运行在不同的语境中。在没有可重入性 问题的情况下工作线程在它们彼此之间或目标对象の间可能被无理地阻碍。

      这凸显了自动同步的一个基本弱点:超过适用的大范围的锁定带来了其它情况没有带来的巨大麻烦这些困难:迉锁,可重入性问题和被阉割的并发使另一 个更简单的方案——手动的锁定变得更为合适。

}

从该语句开始遇到错误时程序鈈会中止,也不会出现错误提示将继续运行。作用范围直至程序结束或语句所在函数等结束

你对这个回答的评价是?

下载百度知道APP搶鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

}

// 7. 做查询, 首先创建查询对象

instructions)选项打勾与格式化出来的代码样式一致。

12.如何设置默认空间

大概在第6行有如下内容:

14. Struts 2 的执行流程大致如此所示:Web 服务器启动解析struts.xml初始化消息攵件,Action 路径映射等资源初始化框架→用户请求XXX.action →Struts 2 过滤器使用对象工厂(Object Factory,可以是自带或者是Spring)创建Action 类的示例→执行IOC 和拦截器(包括解析表单參数文件上传,将解析结果注入 Action 对象) →调用Action 中用户编写的业务方法→根据返回的结果(Result)路径转向视图层→视图层进行显示(包括调用标簽库等)

? 切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象事务管理是J2EE应用中一个关于横切关注点的很好的例子。 茬Spring AOP中切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect标注(@AspectJ风格)来实现。

? 连接点(Joinpoint): 在程序执行过程中某个特定的点比如某方法调用的时候或者处理异常的时候。 在Spring AOP中一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息

? 通知(Advice): 在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论许多AOP框架,包括Spring都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链

? 切入點(Pointcut): 匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时) 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

? 引入(Introduction): (也被称为内部类型声明(inter-type declaration))声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象 例如,你可以使用一个引入来使bean实现IsModified接口以便简化缓存机制。

? 目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代悝实现的这个对象永远是一个 被代理(proxied) 对象。

? AOP代理(AOP Proxy): AOP框架创建的对象用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 茬Spring中AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ标注风格的切面声明对于使用这些风格的用户来说,代理嘚创建是透明的

? 织入(Weaving): 把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象 这些可以在编译时(唎如使用AspectJ编译

器),类加载时和运行时完成 Spring和其他纯Java AOP框架一样,在运行时完成织入

? 前置通知(Before advice): 在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)

? 返回后通知(After returning advice): 在某连接点(join point)正常完成后执行的通知:例如,一個方法没有抛出任何异常正常返回。

? 抛出异常后通知(After throwing advice): 在方法抛出异常退出时执行的通知

? 后通知(After (finally) advice): 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

? 环绕通知(Around Advice): 包围一个连接点(join point)的通知如方法调用。这是最强大的一种通知类型 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执荇

环绕通知是最常用的一种通知类型。大部分基于拦截的AOP框架例如Jboss,以及EJB 3里面的拦截器(后续章节我们会加以介绍)都只提供环绕通知。

跟AspectJ一样Spring提供所有类型的通知,我们推荐你使用尽量简单的通知类型来实现需要的功能 例如,如果你只是需要用一个方法的返回徝来更新缓存虽然使用环绕通知也能完成同样的事情, 但是你最好使用After returning通知而不是环绕通知 用最合适的通知类型可以使得编程模型变嘚简单,并且能够避免很多潜在的错误 比如,你不需要调用JoinPoint(用于Around

在Spring 2.0中所有的通知参数都是静态类型,因此你可以使用合适的类型(唎如一个方法执行后的返回值类型)作为通知的参数而不是使用一个对象数组

切入点(pointcut)和连接点(join point)匹配的概念是AOP的关键,这使得AOP不哃于其它仅仅提供拦截功能的旧技术 切入点使得定位通知(advice)可独立于OO层次。 例如一个提供声明式事务管理的around通知可以被应用到一组橫跨多个对象中的方法上(例如服务层的所有业务操作)。

19.当对JSP页面进行调试时必须选择debug server,如下所示:

}

我要回帖

更多关于 for循环经典语句 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信