Hem
int
ve string
etkili bir iletmenin ve dış kod tarafından değiştirilemez.
Bu durumda, Format yöntemiyle veya String.Concat ile iş parçacığı güvenliği ile ilgilenmeye gerek yoktur.
Ama bize değişebilirdir ve dışarıdan değiştirilebilir bazı sınıf MyObject olduğunu varsayalım: (
public class MyClass
{
public Int32 value1 { get; set; }
public String value2 { get; set;}
}
public static string WriteResult2(MyObject obj)
{
return "Result: value=" + obj.value1 + " name=" + obj.value2 ;
}
Bu durumda tutarsız değer döndürebilir ilk yaklaşımla veya ikinci olsun onu her ikisi de değer1 ve değer2, bir değer zaten çıkışa konulduktan sonra değiştirilir.)
As @JonSkeet pointed aslında, güvensiz olan yöntemin kendisi değildir, ancak sınıfın kendisi farklı konular arasında paylaşılacak güvensizdir. .
özel evreli örnek yöntemini oluşturmak sahip olacaktır Bu durumu düzeltmek için:
public class MyClass
{
private Object lockObj = new Object();
public Int32 value1
{
get
{
lock (this.lockObj) { ... });
}
set
{
lock (this.lockObj) { ... });
}
}
public String value2
{
get
{
lock (this.lockObj) { ... });
}
set
{
lock (this.lockObj) { ... });
}
}
public string WriteResult2()
{
lock (this.lockObj)
{
return "Result: value=" + this.value1 + " name=" + this.value2 ;
}
}
}
Veya kullanmak yöntemlerde gibi durumlarda aşırı bazı ek kilitleme kullanın. Sınıftaki ilk yaklaşım açıkça daha az hataya açık, ancak performansı azaltabilir ve çok sayıda kazan-plaka kodu oluşturabilir. İdeal olarak, eşzamanlı programlamada, paylaşılan değişebilir durum ve onun tutarlılığıyla ilgili daha az dikkat etmeniz gerekir the better.
Ben senin ikinci vaka * yöntemini yapar söyleyemem * parçacığı güvensiz - bu IMO biraz daha farklı bir konudur çoklu iş parçacığı arasındaki * tipi * (Sınıfım) paylaşmak için güvensiz örneklerini yapar. –
"İş parçacığı güvenli" sürümünüz aslında iş parçacığı için güvenli değil ... çünkü herhangi bir iş parçacığı, bir değer edinmeden "değer1" ve "değer2" değiştirebilir. –
@JonSkeet Teşekkürler. Kilit eklemeyi unuttum. –