none
为什么lock不能锁值类型?每次装箱成不同的对象,我知道。可有更生层次的原因? RRS feed

  • 问题

  • 比如线程,进程,操作系统。

    如何分配资源。

    线程一旦被创建,就拥有自己的堆栈(或是只有栈)吗?

    线程 关于线程有个 槽的概念。请牛人详解这个槽。。。

     

    MSN:Eysa@live.cn

    当然,您可以通过这种方式联系我,或留下您的 MSN,QQ,Email 等等联系方式,在下自将登门。

    2011年10月20日 9:12

答案

  • 你提问的方式表明你不理解lock的作用。

    Lock不是锁数据,而是通过Monitor.Enter创建一个临界区来保护数据的完整性,被传递到lock的对象是什么类型以及值是什么对锁是完全没有影响的。对数据访问起同步作用的是你是不是锁了同一个对象,而你每次传递一个值类型到Monitor.Enter都会创建一个不同的装箱对象,所以即使语法允许你锁定值类型,也不会起到加锁的作用。

     



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已建议为答案 mazhou 2011年10月21日 8:29
    • 取消建议作为答案 Dun Eysa 2011年10月23日 6:51
    • 已标记为答案 Lie YouModerator 2011年10月26日 6:52
    2011年10月20日 20:47
    版主
  • 如果是lock值类型的话,每次执行都会重新装箱一次,就像您所说的那样,每次都会创建一个副本。lock的也是副本,也就是说内存地址每次都会不一样。

     


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年10月24日 8:25
    版主
  • 正如前两位版主所叙述,值类型每次都会装箱,所以你的锁也就不起作用了,因此我们一般直接用静态的object对象来锁定,比如:

    static object o=new object();

    Monitor.Enter(o);

    //your code

    Monitor.Exit(o);

    当然Monitor不仅是锁住一段代码,我们还可以将需要修改的引用对象作为锁的参数,并且在代码中对此参数进行修改,这样可以更加的限制对此对象的并发修改;不过应注意死锁的情况

     


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    微软中文论坛同城社区成都QQ群:74268428
    My Blog http://kosmisch.net
    Chengdu,China
    2011年10月24日 9:31
    版主

全部回复

  • 你提问的方式表明你不理解lock的作用。

    Lock不是锁数据,而是通过Monitor.Enter创建一个临界区来保护数据的完整性,被传递到lock的对象是什么类型以及值是什么对锁是完全没有影响的。对数据访问起同步作用的是你是不是锁了同一个对象,而你每次传递一个值类型到Monitor.Enter都会创建一个不同的装箱对象,所以即使语法允许你锁定值类型,也不会起到加锁的作用。

     



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已建议为答案 mazhou 2011年10月21日 8:29
    • 取消建议作为答案 Dun Eysa 2011年10月23日 6:51
    • 已标记为答案 Lie YouModerator 2011年10月26日 6:52
    2011年10月20日 20:47
    版主
  • 是的,会装箱。
    我的意思是说,在锁定一个值类型后,涉及到线程 数据槽,这个槽是否已分配堆栈,而值类型是在栈上,对该线程栈上的内存锁定,是锁定一个副本。
    对吗?

    你提问的方式表明你不理解lock的作用。

    Lock不是锁数据,而是通过Monitor.Enter创建一个临界区来保护数据的完整性,被传递到lock的对象是什么类型以及值是什么对锁是完全没有影响的。对数据访问起同步作用的是你是不是锁了同一个对象,而你每次传递一个值类型到Monitor.Enter都会创建一个不同的装箱对象,所以即使语法允许你锁定值类型,也不会起到加锁的作用。

     



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2011年10月23日 6:54
  • 如果是lock值类型的话,每次执行都会重新装箱一次,就像您所说的那样,每次都会创建一个副本。lock的也是副本,也就是说内存地址每次都会不一样。

     


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年10月24日 8:25
    版主
  • 正如前两位版主所叙述,值类型每次都会装箱,所以你的锁也就不起作用了,因此我们一般直接用静态的object对象来锁定,比如:

    static object o=new object();

    Monitor.Enter(o);

    //your code

    Monitor.Exit(o);

    当然Monitor不仅是锁住一段代码,我们还可以将需要修改的引用对象作为锁的参数,并且在代码中对此参数进行修改,这样可以更加的限制对此对象的并发修改;不过应注意死锁的情况

     


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    微软中文论坛同城社区成都QQ群:74268428
    My Blog http://kosmisch.net
    Chengdu,China
    2011年10月24日 9:31
    版主