Ich bin gespannt, ob der folgende Beispielcode threadsicher ist:

public class Test
{
    [ThreadStatic]
    private static Foo current;

    public static Foo GetFoo()
    {
        return current ?? (current = new Foo());
    }
}

public class Foo
{
}

Normalerweise würde ich Lazy<T> verwenden, aber da es eine separate Variable pro einzelnem Thread gibt, sollte die Eigenschaft von Natur aus threadsicher sein. Ist dies korrekt?

Vielen Dank.

4
Artur Udod 25 Dez. 2015 im 17:37

2 Antworten

Beste Antwort

Der von Ihnen bereitgestellte Code sieht absolut threadsicher aus. Wenn Sie mit Lazy<T> vertraut sind, können Sie ThreadLocal<T> verwenden, das auf ähnliche Weise funktioniert, aber seinen Wert threadsicher und pro Thread speichert.

// Thread-Local variable that yields a name for a thread
ThreadLocal<string> ThreadName = new ThreadLocal<string>(() =>
{
    return "Thread" + Thread.CurrentThread.ManagedThreadId;
});

https://msdn.microsoft.com/en-us/library/dd642243(v=vs.110).aspx

5
Wouter 25 Dez. 2015 im 15:59

Der Code ist in der Tat Thread - sicher, aber denken Sie daran, dass jeder Thread eine eigene Instanz haben wird, dh in Singleton Zum Beispiel, dass Sie nicht verwenden möchten ThreadStaticAttribute.

Die nützlichere Verwendung, die ich für dieses Attribut gefunden habe, besteht darin, nicht Thread - sichere Klassen Thread - sicher - wie Random zu machen.

Random.Next kann 0 zurückgeben, wenn es von mehreren Threads aufgerufen wird. Dadurch ThreadStatic werden die Instanzen für jedes Thread unterschiedlich.

Andererseits initialisiert ThreadStatic das Feld nicht automatisch für jedes Thread.

ThreadLocal<T> auf der anderen Seite Hand, ermöglicht es Ihnen, eine Initialisierungsmethode bereitzustellen, die wie Lazy<T> verwendet wird und beim ersten Zugriff auf jedes Thread Material für Sie initialisiert.

Beachten Sie, dass Sie für ThreadLocal<T> über die Eigenschaft Value auf die tatsächlichen Daten zugreifen müssen.

Außerdem befindet sich Ihre Initialisierung ohnehin in der Methode GetFoo, sodass jede Instanz auch mit ThreadStatic ordnungsgemäß initialisiert wird.

1
Tamir Vered 25 Dez. 2015 im 14:51