zoukankan      html  css  js  c++  java
  • Lock VS Monitor

    Lock Monitor

     

    多线程操作的时候,为防止死锁,我们经常采用加Lock的方式解决,下面就谈一下Lock的具体运用和Lock可以用什么来替换

    首先,看代码:

    private static object syncroot = new object();

    public static void Gets()

    {

    lock(syncroot)

    {

    Console.WriteLine("sbzgw");

    Console.Read(); 

    }

    上段代码中,是Lock的典型应用

    但是,在使用Lock时候有一些注意事项:

    1,Lock里面的参数必须是引用类型,不能是值类型,Lock是对象锁,否则会产生一个不同的引用类型对象,简单介绍下值类型和引用类型

    值类型,参数传递的时候,把自己的值给别人复制一份,无论复制的值如何改变,不会影响原来被复制的值

    引用类型,参数传递的时候,传递的内存地址,如果复制的值改变,原来的值也为改变 

    2, 如果类类型是public的,最好不要用Lock,因为别人都可以用,别人不知道你锁定了,如果他new一个,并且上锁,你也Lock,这时候就造成死锁了

    3,如果MyType是public,不要Lock

    4,永远不要Lock一个字符串

    Lock在实际运用中可以用Monitor(监视器)来替换 

    Lock更简洁,使用更方便,可以确保即使发生异常,也可以释放基础监视器,实际上,Lock就是用Monitor来实现的,调用了finally释放资源

    推荐实际使用中用Lock

    Monitor是一个静态类,不能实例化,只能调用其中的方法 

    上面的代码可以改成下面的写法

    //Monitor注意要配对使用

    private static object syncroot = new object();

    public static void Get2()

    {

    Monitor.Enter(syncroot);

    try

    {

    Console.WriteLine("sbwgy");

    Monitor.Pulse(syncroot);

    }

    finally

    {

    Monitor.Exit(syncroot);

    }

    Console.Read(); 

    这就是Monitor替换Lock的写法

    其实,感觉Lock和Monitor的关系很想.net里面的有个关键字Using,其实Using就是自动执行了Dispose方法,让我们不用担心资源的回收了,但是,不好的地方就在于,长期这么使用,或者一开始就这么用的话,我们可能并不清楚Using都替我们干了些什么事情 

    有点乱,就写到这里吧! 

  • 相关阅读:
    ubuntu 源
    20121211 mysqld.sock丢失无法启动mysql和登陆
    hadoop0.20.2 & hbase0.90.1 集群启动错误“org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientP
    20121204当前集群的几个问题
    hive中的bucket table (输入文件是一个的话,map任务只能启动一个 ,给力啊)
    Android的animation
    获取已安装程序的名字、包名
    android布局属性
    Ghost网络克隆详细步骤教程
    教你如何用PQ魔法师调整硬盘分区大小【图解教程】
  • 原文地址:https://www.cnblogs.com/8090sns/p/3226988.html
Copyright © 2011-2022 走看看