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都替我们干了些什么事情 

    有点乱,就写到这里吧! 

  • 相关阅读:
    Hive split 分割函数
    mysql in 方法查询 按照 in队列里的顺序排序
    根据身份证前2位判断属于哪个省
    java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
    java中的三种取整函数
    mysql show status 参数解析
    java获取多个汉字的拼音首字母
    sql 的积累
    Solr根据参考点的坐标来返回范围内的小区和距离
    docker中使用gpu(darknet-yolo,tensorflow)
  • 原文地址:https://www.cnblogs.com/8090sns/p/3226988.html
Copyright © 2011-2022 走看看