使用Monitor对资源进行保护(二)

使用Lock语句

首先来看一下出现的问题:

接着我们用Lock来解决这个问题:

创建线程安全类型

上面的类型Resource不是类型安全的,它的内部并没有采取线程安全(Thread-safe)的措施。

前面的线程同步时由类型的客户端program来实施的,之所以可行,完全是因为program的作者和resource的作者是同一个人。

因此,最好的办法是将获取锁,释放锁的逻辑放到resource内部来实现。

下面我们用两种方法来改进它:

方法一:

方法二:

使用Monitor来协调线程执行顺序

使用Monitor保证了资源只能同时由一个线程访问,但是没有限制资源现由线程T1访问,还是先由线程T2访问;

由于Start方法实际执行时间的不确定,因此结果可能是主线程先访问,也可能是worker线程先访问。

通常,两个线程执行的不同任务,如工作线程获取计算数据,主线程显示数据。那么此时顺序就很重要了。

我们在此使用wait和pulse方法:

下面两个分方法都必须位于lock块内,并且两个方法接收的对象与lock接受的对象相同。


Wait


Pulse


暂停当前线程并等待信号;


发出信号,接收信号的线程将会执行后续代码。

也可以手动设置等待时间:

当有多个线程等待的时候:

时间: 2024-10-18 11:33:11

使用Monitor对资源进行保护(二)的相关文章

使用Monitor对资源进行保护(一)

首先,来看下使用system.threading.monitor对资源进行保护的思路: 即,使用排它锁,当线程A需要访问某一资源时,对其进行加锁,线程A获取到锁以后,任何其他线程如果再次对资源进行访问,则将其放到等待队列中,知道线程A释放锁之后,再将线程从队列中取出. 主要的两个方法: Enter Exit 获取锁 释放锁 接着是如何利用enter和exit方法实现线程保护的: 使用对象本身作为锁对象 using System; using System.Collections.Generic;

等级保护二、三、四级内容及对比

一.等级保护内容框架 技术要求:物理安全.网络安全.主机安全.应用安全.数据安全及备份恢复 管理要求:安全管理制度.安全管理机构.人员安全管理.系统建设管理.系统运维管理 二.等级保护二.三.四级内容 四级等保要求 三级等保要求 二级等保要求 8.1技术要求 8.1.1物理安全 8.1.1.1物理位置的选择 a)   机房和办公场地应选择在具有防震.防风和防雨等能力的建筑内: a)   机房和办公场地应选择在具有防震.防风和防雨等能力的建筑内: 机房和办公场地应选择在具有防震.防风和防雨等能力的

美团Android资源混淆保护实践

前言 Android应用中的APK安全性一直遭人诟病,市面上充斥着各种被破解或者汉化的应用,破解者可以非常简单的通过破解工具就能对一个APK进行反编译.破解.汉化等等,这样就可以修改原有代码的逻辑.添加新代码.添加或修改资源.或者更有甚者植入病毒等等,从而破坏原有APK的安全和用户体验,最终伤害到用户和原有的开发者. 而事物都是有两方面的,有矛就有盾,针对Android应用安全的各种方案应运而生,大家比较熟悉一般是各类加壳加固的工具,我们可以使用这些工具来保护我们的APK,加壳加固是另外一个话题

近期网上资源收集(二)

英语学习: 广播电台学习英语 http://eradio.ner.gov.tw/ 空中英语教室 http://sc.studioclassroom.com/Sc-rD.php 大家学英语 http://www.studioclassroom.com/lt/LT-RaDio.php 英语原版书阅读:https://zhuanlan.zhihu.com/p/20829443 作者:恶喵的奶爸链接:https://zhuanlan.zhihu.com/p/20829443来源:知乎著作权归作者所有.商

关于在打包Jar文件时遇到的资源路径问题(二)

在关于<关于在打包Jar文件时遇到的资源路径问题(一)>中,以及描述了当资源与可执行JAr分离时的资源路径代码的编写问题,后来想了想,为什么将<Java核心技术卷一>中的程序10-1即ResourceTest的Jar文件放在任何地方都可以执行呢? 图:将原本一起放入目录中的Jar放到桌面上,点击依然能执行 于是我将这个Jar包进行解压,发现在这个包中依然有资源,这就说明了这个包在脱离了原先目录而执行时,依据的资源路径应该是在自己的Jar包中.(至于这个Jar在原先目录时是根据自己包

使用Cloudsim实现基于多维QoS的资源调度算法之二:实现基于多维QoS的资源调度算法

1.Cloudsim体系结构及核心类 CloudSim是一款云计算仿真软件,其由澳大利亚墨尔本大学网格实验室和Gridbus项目于2009年推出,它是一个函数库,可在Windows和Linux系统上跨平台运行,CloudSim的体系结构主要分为四个层次,如图1所示: 图1 Cloudsim 体系结构 Cloudsim仿真层为云计算的虚拟数据中心环境的配置和仿真提供支持,包括虚拟机.内存.容量及带宽的接口,该层用于主机分配到虚拟机的策略研究,并通过扩展核心的虚拟机调度函数实现. Cloudsim最

导入资源 Unity3D笔记(二)

三维格式文件:.fbx .dae .3ds .dxf .obj  ;导入资源所在路径不能有中文: 主流三维软件: Autodesk Maye (3D建模.动画.特效.渲染等电影级别的).Autodesk 3D Studio Max(三维动画渲染和制作).Modo(曲面.建模.雕刻.3D绘图.动画.渲染等综合型强).Cinema 4D(运算速度和强大的渲染插件)Cheetah3D(3D建模和渲染).LightWave(生物建模.角色动画).Blender(建模.动画.材质.渲染.音频.视频.内建P

【Unity3d】【项目学习心得】从资源服务器下载资源(二)

继上篇的基础准备 从资源服务器下载资源(一) 我们现在继续进一步完成 LoadManager 管理类. 管理类因为在全局中都是存在的,所以应该作为单例存在. 因为LoadManager 类是管理多个 LoadRequest的,所以我们需要存储当前正在下载的LoadRequest,以及下载完成的 LoadRequest. 另外,我们为了防止太多下载线程占用过多资源,我们对于下载的线程个数做一定的限制,如项目里面的最大线程数为2,所以我们需要一个存储LoadRequest的等待队列. 根据以上分析,

多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore

"线程同步"的含义 当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行"线程同步(thread synchronization)". 线程同步的道理虽然简单,但却是给多线程开发带来复杂性的根源之一.当线程同步不好时,有可能会出现一种特殊的情形--死锁(Dead Lock). "死锁"的含义 死锁表示系统进入了一个僵化状态,所有线程都没有执行完毕,但却谁也没法继续