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

首先,来看下使用system.threading.monitor对资源进行保护的思路:

 

即,使用排它锁,当线程A需要访问某一资源时,对其进行加锁,线程A获取到锁以后,任何其他线程如果再次对资源进行访问,则将其放到等待队列中,知道线程A释放锁之后,再将线程从队列中取出。

 

 主要的两个方法:


Enter


Exit


获取锁


释放锁

 

 

 接着是如何利用enter和exit方法实现线程保护的:

使用对象本身作为锁对象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;

//使用monitor解决和上面类似的问题,
        //创建一个自定义的类型resource,然后在主线程和worker线程上调用他的record方法

namespace Monitor
{

    public class Resource {

        public string called;

        //定义要访问的资源
        public void Record() {

            this.called += string.Format("{0}{1}",Thread .CurrentThread .Name ,DateTime .Now .Millisecond);
            Console.WriteLine(called);
        }
    }

    class Program
    {
        private Resource res = new Resource();

        static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "main ";

            Program p = new Program();
            Thread worker = new Thread(p.ThreadEntry );  //工作线程
            worker.Name = "worker";
            worker.Start();  //开启工作线程
            p.ThreadEntry();  //主线程中调用同样的方法

        }

        //要同时共享的方法
        void ThreadEntry() {

             System.Threading .Monitor.Enter(res);  //获取锁
                res.Record();
             System.Threading .Monitor.Exit(res);    //释放锁

        }
    }
}

使用System.Object作为锁对象

Monitor有一个限制,就是只能对引用类型加锁。
    如果将上面的Resource类型改为结构型,就会抛出异常

   解决的方法是将锁加载其他的引用类型上:
            比如system.object。此时,线程不会访问该引用类型的任何属性和方法,该对象的作用仅仅是协调各个线程。加锁思路:之前对于对象的加锁是占有A,操作A,释放A;现在的操作是占有B,操作A,释放B;

namespace 使用system.object作为锁对象
{

    //资源
    public struct Resource {

        public string Called;
        public void Record() {

            this.Called += string.Format("{0} {1}",Thread .CurrentThread .Name ,DateTime .Now .Millisecond);
            Console.WriteLine(Called);

        }
    }

    //
    class Program
    {
        private Resource res = new Resource();//资源
        private object lockobj = new object();  //用来加锁的介质

        private object lockobj2 = new object();

        static void Main(string[] args)
        {
            #region 只有一个加锁对象
                //Thread.CurrentThread.Name = "main ";

                //Program p = new Program();
                //Thread worker = new Thread(p.ThreadEntry);  //创建新线程
                //worker.Name = "worker";
                //worker.Start();  //开启新线程
                //p.ThreadEntry();
            #endregion

            #region 双对象:不能保证所有线程加锁和释放锁都是针对同一个对象B

            Thread.CurrentThread.Name = "main ";

            Program p = new Program();
            ParameterizedThreadStart ts = new ParameterizedThreadStart(p.ThreadEntry);

            Thread worker = new Thread(p.ThreadEntry);  //创建新线程
            worker.Name = "worker";

            //注意下面工作线程和主线程不是针对一个对象进行加锁的。。。运行时会得出他俩一起进入的时间
            worker.Start(p.lockobj);  //开启新线程
            p.ThreadEntry(p.lockobj2); 

            #endregion
        }

        void ThreadEntry(object obj) {

            Monitor.Enter(obj);
            res.Record();
            Monitor.Exit(obj);
        }

        #region 一个对象加锁
            //void ThreadEntry()
            //{

            //    Monitor.Enter(lockobj);//获取锁
            //    res.Record();
            //    Monitor.Exit(lockobj);//释放锁

            //}
        #endregion
    }
}

使用System.Type作为锁对象

    为了改进使用System.Object作为锁对象时,需要单独创建一个对象加锁使用,不够简洁,所以使用Sytem.type作为锁对象。

   使用type的好处是:多次调用typeof(type)获取的是同一个对象

namespace 使用system.type作为锁对象
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "main ";

            Program p = new Program();
            Thread worker = new Thread(p.ThreadEntry);  //创建新工作线程
            worker.Name = "worker";
            worker.Start();  //开启工作线程
            p.ThreadEntry(); //main里面开启工作线程

        }

        void ThreadEntry() {

            Monitor.Enter(typeof(Resource));//获取锁
            Resource.Record();
            Monitor.Exit(typeof (Resource));  //释放锁

        }
    }

    public static class Resource{

        public static string Called;

        public static void Record(){

            Called += String.Format("{0} {1}",Thread .CurrentThread .Name ,DateTime .Now .Millisecond);
            Console.WriteLine(Called);

        }

    }
}
时间: 2024-10-06 14:04:19

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

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

  使用Lock语句      首先来看一下出现的问题:   接着我们用Lock来解决这个问题: 创建线程安全类型    上面的类型Resource不是类型安全的,它的内部并没有采取线程安全(Thread-safe)的措施.    前面的线程同步时由类型的客户端program来实施的,之所以可行,完全是因为program的作者和resource的作者是同一个人.     因此,最好的办法是将获取锁,释放锁的逻辑放到resource内部来实现. 下面我们用两种方法来改进它:   方法一:    方

中国保护资源做法遭欧美无理诉讼

中国削减几种主要稀有金属出口 本报综合消息欧盟昨日发表声明称,美国与欧盟当天就中国限制出口稀有金属问题向世界贸易组织(WTO)提起诉讼.报道,这将成为1月份奥巴马上任后,美国向WTO起诉中国的首案. 此前,美国和欧盟未能说服中国削减出口关税并提高锌.锡.钨和黄磷等原材料的配额. 欧盟在这份声明中称:"欧盟23日提请WTO审查有关中国限制出口几种主要的稀有金属问题,这一决定违背了国际贸易准则." 据了解,根据WTO的手续,首先将在当事国间进行双边协商.若协商失败,双方可要求成立争端处理小

网络114:巨资购域名是为了保护域名资源

近日,米市有消息称某买家以700万巨资"包养"二十几个city.Cn相关域名,随着交易域名的相继上线,域名包养者-网络114成为业界关注的焦点. 现在,打开网络114首页,城市旅游.城市人物.城市广告.城市购等一个个以城市打头的频道名就映入眼帘,而各频道的独立域名citytravel.Cn.cityren.Cn.cityad.Cn.citygo.Cn等即为此次网络114斥巨资购买的city域名. 网络114相关负责人在接受记者采访时表示,网络114之所以花巨资购买域名是为了对网络114

http auth basic认证保护后台admin

一个web站点,总会有一些资源需要保护,比如图片文件.某些页面等,使用basic认证简单方便,易于配置,且完全独立于开发.basic认证既可以在web容器上,也可以放到前端服务器上 .需要对后台地址admin进行保护,可以使用http auth basic,既方便又简单  resin配置  basic的resin配置需要在web项目的描述文件web.xml中,通过添加如下内容,可以对指定路径的资源进行保护,所有对指定资源的访问,都需要输入配置的用户名与密码,验证通过后才可以正常访问 Java代码

在BYOD环境中 如何保护端点安全?

本文讲的是 :  在BYOD环境中 如何保护端点安全?  ,[IT168 评论]在企业端点领域涌现出很多新设备和平台,这可能让Wintel(由Microsoft Windows操作系统与Intel CPU组成的个人计算机)的霸主地位受到动摇,但对于企业来说,这种竞争可能意味着端点保护工作将变得更加简单. 在2013年Gartner安全和风险管理峰会上,Gartner研究副总裁Peter Firstbrook向与会者介绍了不断变化的端点安全形势.尽管75%的平板电脑和笔记本电脑都由消费者购买,但很

辽宁省举办世界海洋日宣传活动,主题为“保护海洋环境,发展蓝色经济”

6月8日是世界海洋日暨全国海洋宣传日,我省今年海洋日宣传活动主题是 "保护海洋环境,发展蓝色经济".当天,各地开展多种形式的宣传活动,积极倡导公众科学开发利用海洋,珍惜海洋资源,保护海洋生态环境和海洋生物多样性,努力构建和谐的人海关系. 海洋宣传日主会场活动由省海洋与渔业厅和葫芦岛市政府联合主办,活动展示了涉海摄影作品和画作,发放宣传环保袋1500个.宣传画册2700本,通过开展环保志愿者清洁海滩活动,举行大学生海洋知识竞赛等形式,拉近了公众与海洋的距离,提升了公众的海洋意识.在分会场

农业部:冬虫夏草资源严格执行采集许可证制度

农业部副部长高鸿宾上周出席2010年http://www.aliyun.com/zixun/aggregation/30516.html">冬虫夏草国际会议组委会信息通报会时指出,中国政府加强对冬虫夏草资源分布规律.生长环境.人工培育.产品开发等方面的研究.通过制定科学的采集计划,严格执行采集许可证制度,加强监督检查. 高鸿宾指,中国政府高度重视冬虫夏草等野生植物资源的保护和可持续利用工作,牢固树立和贯彻落实以人本.全面协调可持续的科学发展观,正确处理经济发展.资源利用与环境保护的关系.

115网盘禁止影视资源外链 网盘行业路在何方

中介交易 SEO诊断 淘宝客 云主机 技术大厅 3月4日消息,国内知名网盘服务提供商115网盘昨日发布公告称,自3月7日起将全面禁止对影视资源的外链. 行业人士对此表示,115网盘此举无疑是为了响应"有关部门"对互联网知识产权的保护政策,这无疑给广大的网盘用户和站长投下了一颗"重磅炸弹",同时也给同行敲响了警钟. 最近一年无论是在线视频网站还是影视BT网站,文化部对影视版权资源的保护力度都是空前的加强.此次115网盘全面禁止对影视资源外链的共享,是否标志着之前备受争

三大移动运营商资源难共享梅泰诺坐收渔利

人民网北京12月31日电为提高电信基础设施利用率,2008年9月28日工信部和国资委共同下发了<关于推进电信基础设施共建共享的紧急通知>.然而目前看来电信运营商对此并不"买帐",通信塔共建一时难以实现,却也正因此本应饱受采购下滑冲击的通讯塔行业利润不但未受削减,反而增速不减.图:北京梅泰诺通信技术股份有限公司招股说明书披露的前十大客户合同情况 为了节约资源,保护自然环境,减少电信重复建设,<通知>要求,已有铁塔.杆路必须共享:新建铁塔.杆路必须共建:其他基站设施