2016-03-29 21 views
3

Ben sınıfları aşağıda var:Bu statik yöntem iplik güvenli midir?

public static class MetadataManager 
{ 
    // assume that it is thread safe 
    public static List<Field> FieldRegistry { get; set; } 
} 

public class Field 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 



public static class FieldDataValidationManager 
{ 
    public static bool Validate(int fieldID) 
    { 
     return MetadataManager.FieldRegistry.FirstOrDefault(f => f.ID == fieldID).ID > 1; 
    } 

    public static bool Validate(Field field) 
    { 
     return fieldID.ID > 1; 
    } 
} 

Şimdi Kullanıcı1 ve kullanıcı2 aynı anda statik yöntemini çağırıyor, eşzamanlılık ilgili herhangi bir sorun var mı?

FieldDataValidationManager.Validate(111) 

veya Kullanıcı1 FieldDataValidationManager.Validate(field1) yürütme ve kod sadece listeden okuyor beri Kullanıcı2, FieldDataValidationManager.Validate(field2)

cevap

8

Evet, kod parçacığı güvenlidir yerine getiriyor. Statik olmak ya da olmamak hiç önemli değil.

List<T> üzerinde yazma eylemleri varsa, olası eşzamanlılık sorunlarınız olabilir. Ardından, ConcurrentBag<T> veya diğer evrak güvenli toplama türlerini kullanmalısınız.

3

FieldRegistry listesinin içeriğini değiştirmediğiniz sürece eşzamanlılık sorunu yaşanmaz.
Ancak, bu listeyi nereye eklediğinizi göstermediniz. Yani diğer kod gerçek kodu gerçek kod Validate çağırıyor ya da kaldırır, bu nedenle sorun olacaktır (Patrick Hofman tarafından önerilen gibi bir ConcurrentBag<T> iyi bir alternatif olabilir).


Ama aslında burada yapmaya çalıştığımız ne:

public static bool Validate(int fieldID) 
{ 
    return MetadataManager.FieldRegistry.FirstOrDefault(f => f.ID == fieldID).ID > 1; 
} 

Yani sizin fieldID zaten IDveID1 büyükse ile giriş varsa geçerlidir görünüyor?
Tamam, ancak yönteminiz NullReferenceException'u fieldID listenizde yoksa, atar. Bu yöntemi şu şekilde değiştirmelisiniz:

public static bool Validate(int fieldID) 
{   
    return 
     MetadataManager.FieldRegistry.Any(f => f.ID == fieldID) && 
     fieldID > 1; 
} 
+0

Değerli Rene. Sana katılıyorum ama sadece örnek. – Tim

İlgili konular