Difference between manual locking and Synchronized methods

后端 未结 5 739
广开言路
广开言路 2020-12-23 09:08

Is there any difference between this:

internal class MyClass
{
    private readonly object _syncRoot = new Object();

    public void DoSomething() 
    {
           


        
相关标签:
5条回答
  • 2020-12-23 09:42

    This article may help you: http://www.yoda.arachsys.com/csharp/threads/lockchoice.shtml

    Generally I would avoid locking on 'this', as private lock variables, provide better control. I would recommend locking on 'this', if it's a custom collection class, something along the lines of SyncRoot, if that is what is required.

    Hasanain

    0 讨论(0)
  • 2020-12-23 09:46

    The first method is preferred because you can (and should) make _syncRoot private. This lowers the risk of deadlocking.

    The MethodImplOptions.Synchronized is a left-over from an earlier ambitious idea that turned out to be not so good after all.

    Regarding the last question: Yes, according to this blog they are functionally equivalent (but not implemented the same way). And all forms of lock(this) are discouraged, again because of deadlock scenarios.

    0 讨论(0)
  • 2020-12-23 09:46

    Just having a quick look and found that portable devices do not support MethodImplOptions.Synchronized.

    There is also a remark:

    Locking on the instance or on the type, as with the Synchronized flag, is not recommended for public types, because code other than your own can take locks on public types and instances. This might cause deadlocks or other synchronization problems.

    source: http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions%28v=VS.100%29.aspx

    0 讨论(0)
  • 2020-12-23 09:52

    check out http://blogs.msdn.com/b/bclteam/archive/2004/01/20/60719.aspx and http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_20926988.html
    They discuss about lock(this) too and discourage using it since:

    completely unrelated code can choose to lock on that object as well

    Quoting from EE:

    If you lock an object, all other threads that need to access THIS PARTICULAR OBJECT will wait, until the other object finishes. However if you mark a method as Synchronized, THIS PARTICULAR METHOD will not be executed at more than one thread. Lock secures the object, Synchronized secures the method.

    0 讨论(0)
  • 2020-12-23 10:04

    I think the difference would depend on what objects are being referenced in the decorated methods. From what I've read, the decoration actually implements lock() in IL.

    The best approach would be to do the most specific locking as necessary.

    0 讨论(0)
提交回复
热议问题