none
.net属性的get和set有没有方便的加锁方法? 好像java有。 RRS feed

  • 问题

  • //java code:

    public class synchronizedInteger{ private int value; public synchronized int get(){ return value; } public synchronized void set(){ this.value=value; } }


    //C# code:

    private Object _isCanceledSync = new Object(); public Boolean IsCanceled { get { lock (_isCanceledSync) { return _isCanceled; } } set { lock (_isCanceledSync) { _isCanceled = value; } } }

    一个属性,我不想它在get的时候有另一个线程对它set,所以加了一个锁。
    但是这样子太丑了,而且一个对象有很多个属性,那我得搞多少个Object对象来锁啊?
    如果一个对象的所有属性都用同一把锁(_SyncRoot),会很容易造成死锁,我不想这样子。

    .net的属性有没有提供内部锁这样的东西?

    比如java好像有这样的,它提供一个叫synchronized 的关键字。

    2012年12月13日 9:26

答案

全部回复

  • 希望对每个属性都有一个内部锁,那我们就不用建很多个Object对象用来锁定了。

    突然有一个想法:难道.net的所有get和set已经是线程安全了吗?

    2012年12月13日 9:29
  •  [MethodImpl(MethodImplOptions.Synchronized)]
    get
    {

    }

     [MethodImpl(MethodImplOptions.Synchronized)]

    set{}

    2012年12月13日 10:05
  •  [MethodImpl(MethodImplOptions.Synchronized)]
    get
    {

    }

     [MethodImpl(MethodImplOptions.Synchronized)]

    set{}

    谢谢你!
    不好意思,我刚才说得不是太清楚。
    刚在网上查了一下,网上说:
        如果[MethodImplAttribute(MethodImplOptions.Synchronized)]被应用到instance method,相当于对当前实例加锁。
        如果[MethodImplAttribute(MethodImplOptions.Synchronized)]被应用到static method,相当于当前类型加锁
    也就是说对实例的方法,它相当于lock(this)。
    现在想想可能我刚才说的java的那个Synchronized关键字跟你提供的attribute作用是一样的,但这还不是我想要的。

    我想让instance的每个property都有它一个属于它自己的Object可以用来锁住,这个锁只是为了防止在set运行的过程中,另一个线程执行get而读到脏数据。
    锁住this对象的话,有点太大了,怕易死锁。

    就像上面的代码中,我专门为一个property建了一个Object用来锁:  "private Object _isCanceledSync = new Object();"
    它可以起到效果,但是我想有没有办法省下为每个property都建军一个Object这个步骤呢?
    因为给每个property都自建一个Object用来锁的话,代码太冗余太乱了。

    ^_^

    2012年12月13日 12:25
  • 您好,暂时没有这样的方法或者属性可以完成这个目的。

    Mike Feng
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 bitfish_jzl 2012年12月16日 2:31
    2012年12月14日 9:12
    版主
  • 没有现成的,只能自己实现。

    • 已标记为答案 bitfish_jzl 2012年12月16日 2:31
    2012年12月14日 9:27
  • 谢谢两位 :)
    2012年12月16日 2:32