Har inte riktigt hajja trådning och dess konsekvenser så jag måste fråga!
Jag har denna statiska metod som kollar om gästrollen finns i listan.
Innebär det att en annnan användare skulle kunna få resultatet av denna lista och därmed i slutändan få tillgång till sidor den ej har behörighet till?
public class RoleInfo
{
public static bool IsGuestVisible(IList<UserRole> roles)
{
foreach (UserRole r in roles)
{
if (r.Name == "Guest")
return true;
}
return false;
}
}
Inte om listan bara refereras av en enda tråd, nej. Metoden i sig är trådsäker, d.v.s, den modifierar inte något tillstånd som delas av flera trådar, förutsatt att listan som skickas in inte delas av flera trådar.
Oki! Men hur vet man om listan delas av flera trådar? Är det nått man själv har skapat eller kan trådar klona sig själv så att säga?
Nej, trådar klonar inte sig själva. Om ett objekt refereras av >1 tråd beror det på att en referens antingen skickats in till startfunktionen för tråden, eller för att det finns en (direkt eller indirekt) static-referens till objektet. Är det något du själv new:ar och inte skickar till någon suspekt mottagare är det lugnt.
Själv så brukar jag alltid använda mig av lock() så fort jag använder mig av trådar. Är det fall där man kan (rent programatiskt) ändra informationen från en annan tråd så åker det ditt ett lock() i bara farten för att säkra mot eventuella framtida problem med lock. Det gäller skrivning, oftast så behöver man inte ha lock om du bara skall läsa.
Man måste dock tänka på att man måste använda sig av samma lock-object annars så gör det inte så mycket nytta. Så jag brukar wrappa List<>/Collection<> eller vilken lista jag nu vill ha och slänga ditt en SyncLock properties på dessa, så om jag har en instans av en lista och den skickas runt mellan olika klasser så kan alla klasserna använda sig av samma lock-objekt. Eller så lockar du bara listan, vilket går det med...
Om man skapar lock-objektet i din klass och sedan skickar listan till en annan klass och skapar ett nytt lock-objekt i den klassen så blir inte din kod trådsäker, eftersom du då har låst på 2 olika objekt.