.net - sperrt den Boxwert anstelle eines neuen Objekts

  • Ich bin kürzlich in einem der Projekte, an denen ich arbeite, auf diesen Code gestoßen, und ich bin mir nicht sicher, wie er sich verhalten soll pre> private static object _syncRoot = 1; public void DoSomething() { lock (_syncRoot) { // do stuff... } }

    Ich weiß, dass es üblich ist, new object() für Ihre Sperre zu verwenden. Wie verhält sich diese Sperre für eine Boxed Integer? Was passiert, wenn Sie eine weitere Sperre mit demselben Wert hinzufügen?

     private static object _anotherLock = 1;
    
    public void DoSomethingElse()
    {
        lock (_anotherLock)
        {
            // do stuff...
        }
    }
     
    22 November 2011
    Daniel SchillingAnthony Gatlin
4 answers
  • lock verwendet immer die Referenzgleichheit.

    Zwei verschiedene 1 -Kästchen geben zwei verschiedene Sperren an

    22 November 2011
    SLaks
  • Obwohl dies nicht direkt mit dem Boxen zu tun hat, könnte es kaputt gehen, wenn ein String wie "1" anstelle eines int verwendet wird. Zwei Strings mit dem gleichen konstanten Wert können dieselbe Referenz haben. Daher würde das Sperren der "separaten" Strings den gleichen Synchronisationsblock verwenden. Im Allgemeinen würde ich new object () [ein bekanntes gutes Muster] über eine Konstante wie diese empfehlen.

    Tatsächlich bin ich nicht sicher, ob Boxen zu eindeutigen Instanzen tatsächlich ist in der spec. Ich könnte es durchaus als eine mögliche Verbesserung der CLRs betrachten, einen "Boxing Pool" für gängige Konstanten (Like 0 oder 1) zu erstellen. Wenn dies implementiert wäre, würde diese Verwendung fehlschlagen (höchstwahrscheinlich auf ziemlich unangenehme und unvorhersehbare Weise.)

    22 November 2011
    Dan Bryant
  • Der zweite Wert wird in ein anderes Objekt eingefügt. Die Sperren sind völlig unabhängig voneinander, da sie auf zwei verschiedene Objekte verweisen.

    22 November 2011
    Polynomial
  • Dies sperrt 1 nicht, es kann also nicht kurz gesagt sein, dass sich die Objekte in den Boxen unterscheiden und diese Sperren sich unterscheiden.

    Es gibt einen Grund Warum können ValueTypes nicht gesperrt werden.

    22 November 2011
    Aliostad