zoukankan      html  css  js  c++  java
  • lock()

    在网上看 都这样写的
    private Object thisLock = new Object(); 
    lock (thisLock)
    {
        ...
    }
    那么 lock() 括号里面  规定的语法是什么 大括号{ } 里面应该写什么
    如果我有个 FunLog() 方法 然后有多个线程都用到了这个方法 我该怎么锁定这个方法

    不摆大理论,理论的大是大非自己去MSDN研读。
    lock就是把{}中的代码段锁定,防止多个线程同时运行该代码段。
    用法:

    private void Do()
    {
    threat t1=new threat(doSomething);
    threat t2=new threat(doSomething);
    t1.Start();
    t2.Start();
    }
    
    object locker=new object();
    private void doSomething()
    
    {
    ...........
    .........
    lock(locker)
    {
    FunLog() ;
    
    }
    ........
    }

    比如说上面这样,当t1执行到lock时,检测发现locker不在锁定列表中,它会记录locker的内存地址,加入到锁定列表,并开始执行lock的锁定代码段;t2再执行到lock时,检测发现locker的内存地址是在锁定列表中的,于是线程等待;t1执行完FunLog到达lock结尾,将locker地址从锁定列表删除;t2检测发现locer已不在锁定列表中,它会记录locker的内存地址,加入到锁定列表,并进入执行lock的代码段。

    lock(...) 括号里面的内容必须是 object 吗????

    lock(...)括号里的内容应该是一种引用类型,C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。
    因此


        {
        }
    struct S
    {
    }
    int i;
    object o;
    string str;
    A a=new A();
    S s=new S();
    lock(i){}//错误
    lock(o){}//正确
    lock(str){}//正确
    lock(a){}//正确
    lock(s){}//错误

    lock主要用于处理并发问题、锁定独占对象。
    锁住当前实例:lock(this)
    锁住此类的所有实例:lock(typeof([Type]))
    对字符串的锁,会锁定所有相同内容的字符串,建议可以用静态字符串代替
    lock关键字比Monitor简洁,其实lock就是对Monitor的Enter搜索和Exit的一个封装
    lock是一种比较好用的简单的线程同步方式

    public void Function()
    {
    object lockThis = new object();
    lock (lockThis)
    {
    }
    }
    还可使用monitor,mutex,ReaderWriterLock
    发现自己的不足,善于利用找到的方法去扬长避短。行动起来。
  • 相关阅读:
    MySQL系列(三) MySQL的约束
    mysql 下载 国内 镜像
    ckeditor
    比较时间
    远程获取文件
    多线程一例
    requests
    json传递对象字典
    pymysql和mysqldb的区别
    sql
  • 原文地址:https://www.cnblogs.com/rechen/p/5125815.html
Copyright © 2011-2022 走看看